使い所が難しいマイナーな運用コマンド
[最終更新] (2020/07/27 21:21:53)
最近の投稿
注目の記事

コマンドのエイリアスを登録する (update-alternatives)

mybin という名前のコマンドを登録

sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10
sudo update-alternatives --install /usr/local/bin/mybin mybin /bin/ls 10

シンボリックリンク先となる候補が複数ある場合は選択して有効化

sudo update-alternatives --config mybin

There are 2 choices for the alternative mybin (providing /usr/local/bin/mybin).

  Selection    Path            Priority   Status
------------------------------------------------------------
  0            /bin/ls          10        auto mode
* 1            /bin/ls          10        manual mode
  2            /usr/bin/echo    10        manual mode

削除

sudo update-alternatives --remove-all mybin

CPU 情報を表示 (lscpu)

lscpu

バイナリファイルから文字列を抽出する (strings)

文字列らしい部分をバイナリファイルから抽出して出力するコマンドです。得体の知れないコマンドのオプションを調べたり

$ strings /usr/bin/gcc | grep ^--
--help
--target-help
--sysroot=
--all-warnings
--ansi
--assemble
--assert
--classpath
--bootclasspath
--CLASSPATH
...

あるいは、こちらのページのtcpダンプの出力結果であるバイナリログファイルを解析したりできます。

$ cat http.cap | strings
<!w@
(!x@
CT5_
GET / HTTP/1.1
User-Agent: curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: www.yahoo.co.jp
Accept: */*
CTSa
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 19 Oct 2014 15:08:09 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
...

コマンドの出力結果の差分を表示 (diffの応用)

$ diff -u <(echo 'test') <(echo 'test2')
--- /dev/fd/63  2014-11-02 16:53:41.872004003 +0900
+++ /dev/fd/62  2014-11-02 16:53:41.874003932 +0900
@@ -1 +1 @@
-test
+test2

クリップボードの操作 (xclip)

xclip -out -selection clipboard > txt
xclip -in -selection clipboard < txt

ファイルを横に連結 (paste, join)

1.txt

1 A
2 B
3 C
5 E
6 F

2.txt

1 X
3 Z
2 Y
4 S

paste

$ paste 1.txt 2.txt
1 A     1 X
2 B     3 Z
3 C     2 Y
5 E     4 S
6 F
$ paste 1.txt 2.txt -d':'
1 A:1 X
2 B:3 Z
3 C:2 Y
5 E:4 S
6 F:

join

$ join <(sort 1.txt) <(sort 2.txt) -1 1 -2 1 -i -t' ' -o'1.1 1.2 2.1 2.2'
1 A 1 X
2 B 2 Y
3 C 3 Z
$ join <(sort 1.txt) <(sort 2.txt) -1 1 -2 1 -i -t' ' -o'1.1 1.2 2.1 2.2' -a 1 -a 2
1 A 1 X
2 B 2 Y
3 C 3 Z
  4 S
5 E  
6 F  
$ join <(sort 1.txt) <(sort 2.txt) -1 1 -2 1 -i -t' ' -o'1.1 1.2 2.1 2.2' -v 1 -v 2
  4 S
5 E  
6 F  
  • -1 1 一つ目のファイルの第一列をキー
  • -2 1 二つ目のファイルの第一列をキー
  • -i キーの大文字小文字を区別しない
  • -t ' ' 入力ファイルと出力ファイルの列の区切り文字
    • -t $'\t' とするとタブを指定できます。
  • -o'...' 出力する列とその順番 (n.k は第 n ファイルの第 k 列)
  • -a 1 -a 2 一つ目と二つ目のファイルの一致しなかった行も出力
  • -v 1 -v 2 一つ目と二つ目のファイルの一致しなかった行だけを出力

数値を ASCII コードに変換

$ echo '65,66,67' | perl -M-warnings -lne "print map {chr} split /,/"
ABC

16 進数表記の場合は echo コマンドが便利です。

$ echo -e "\x41\x42\x43"
ABC
$ echo -e '\xE3\x81\x82'
あ

ルートディレクトリを変更 (chroot)

いわゆるルートディレクトリ '/' を任意のディレクトリに変更するコマンドです。動作検証のできていない外部プログラムを実行する際などに使用します。FreeBSD では同様の機能を提供する jail コマンドが有名です。

$ sudo mkdir -p /chroot/a
$ sudo chroot /chroot/a
bash-4.1# pwd
/
bash-4.1# exit

chroot の引数に指定する新しいルートディレクトリには少なくとも /bin/sh およびそれが依存するライブラリが格納されている必要があります。ldd コマンドについてはこちらをご参照ください。

$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Mar  7  2014 /bin/sh -> bash

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fff07fc2000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fa658494000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fa658290000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa657efb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa6586bb000)

$ sudo mkdir /chroot/a/lib64
$ sudo cp /lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 /chroot/a/lib64/
$ sudo mkdir /chroot/a/bin
$ sudo cp /bin/bash /bin/sh /chroot/a/bin/

ハッシュ値を計算 (md5sum)

md5 ではなく md5sum コマンドを使用します。

$ echo 'abc' | md5sum
900150983cd24fb0d6963f7d28e17f72 *-

ほとんどの方には関係ありませんが Emacs の組み込み関数 md5 とは挙動が異なるため注意しましょう。

$ md5 abc
900150983cd24fb0d6963f7d28e17f72

環境変数を引き継いで sudo

sudo を実行する際に環境変数を引き継ぎたい場合は -E オプションを使用します。

準備

$ export MY_ENV=777
$ cat test.sh
echo $MY_ENV
$ chmod +x test.sh
$ ./test.sh
777

比較

$ sudo ./test.sh
               ← 何も表示されません
$ sudo -E ./test.sh
777

環境変数を一時的に変更してコマンド実行 (env)

コマンド env は環境変数を一覧表示する機能だけでなく、実行時の環境変数を一時的に変更する機能も提供します。表示するだけであれば printenv と同様です。

$ env | grep LANG
LANG=ja_JP.UTF-8

$ env LANG=C date
Thu Feb 12 01:13:10 JST 2015

$ date
2015年  2月 12日 木曜日 01:13:14 JST

DISPLAY 環境変数を指定して SSH 先の GNOME 端末に AA を表示する。関連: wall コマンド

DISPLAY=:0 gnome-terminal -e 'bash -c "cowsay hello; sleep 5"'

サーバ稼動時間を表示 (uptime)

topコマンドの基本的な使い方」で記載した内容と同じです。サーバ稼動時間、ログインユーザ数、過去1,5,15分前までのロードアベレージの平均値が順に表示されます。

$ uptime
16:26:57 up 1:43, 1 user, load average: 0.00, 0.00, 0.00

システムの情報を表示 (uname)

ネットワークノード情報 (ホスト名, ドメイン名)

$ uname -n
localhost.localdomain

OS名

$ uname -o
GNU/Linux

CPU情報

$ uname -m
i686

OS のリリース番号

$ uname -r
2.6.32-504.3.3.el6.x86_64

(参考) OS の情報は以下のようにしても確認できます

$ cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

テキストを行列に見立てて特定の列のみを切り出す (cut)

左から何番目かを指定して切り出す

$ echo '0,1,2,3,4
5,6,7,8,9' | cut -c1,3-4

実行結果

01,
56,

区切り文字を基準として切り出す

$ echo '0,1,2,3,4
5,6,7,8,9' | cut -d',' -f1,3-4

実行結果

0,2,3
5,7,8

ユーザパスワードを削除

$ sudo passwd -d username

公開鍵の fingerprint を調査

RSA 鍵として妥当性の検証や、鍵長の調査にもなります。

$ ssh-keygen -lf ~/.ssh/id_rsa.pub

行番号を表示する (cat -n)

$ cat -n sample.pl
1  #!/usr/bin/perl
2  use strict;
3  use warnings;
4  use utf8;
5  use Data::Dumper;
...

LVS (Linux Virtual Server) の設定を確認 (ipvsadm)

sudo yum install ipvsadm
sudo ipvsadm -Ln

システムリソースの上限を確認 (ulimit -a)

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3518
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited  ←物理メモリの使用サイズ上限
open files                      (-n) 1024  ←ファイルディスクリプタ数の上限
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited  ←CPU時間の上限
max user processes              (-u) 1024  ←プロセス数の上限
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

root ユーザで作業中に他のユーザ権限でコマンド実行 (su)

sudo と異なり、例えば疑似端末 tty がない場合でも問題なく実行できます。rc.local で一般ユーザ権限のプロセスを起動したい場合などに有用です。

$ su -l username -c 'echo $HOME'

システム起動時に実行するコマンドを登録 (/etc/rc.local)

Windows のスタートアップのようなものは /etc/rc.local として提供されています。すべての init スクリプトが完了した後に登録された内容が実行されます。AWS EC2 を利用している場合、User Data という似た機能があります。

$ cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

# 何らかのシステム的な処理を一般ユーザで実行
su -l username -c /usr/etc/sample.sh

プロセスが殺せない (kill -s 9)

こちらのページに記載しましたように、kill はオプション無指定で SIGTERM シグナルを送信します。状況によって SIGTERM ではプロセスを殺せないことがあります。そのような場合は SIGKILL を送信することでプロセスを殺せることがあります。

$ kill -s 9 PID

プロセスが止められない

SIGINT (Ctrl-C) で止められない場合、SIGSTOP (Ctrl-z) でバックグラウンドに移してから SIGKILL を発行します。%1 はジョブ番号です。

kill -9 %1

XML および JSON をコマンドライン上で見易く表示 (xmllint, jq)

XML (xmllint)

CentOS 6.6 の場合は /usr/bin/xmllint に標準インストールされています。

$ echo '<?xml version="1.0" ?><venture><company><name>ABC</name><url>http://www.abc.co.jp/</url></company><company><name>XYZ</name><url>http://www.xyz.co.jp/</url></company></venture>' | xmllint --format -

<?xml version="1.0"?>
<venture>
  <company>
    <name>ABC</name>
    <url>http://www.abc.co.jp/</url>
  </company>
  <company>
    <name>XYZ</name>
    <url>http://www.xyz.co.jp/</url>
  </company>
</venture>
  • --format → インデントなどによって整形
  • - → ファイル名を指定せずに標準入力からデータを受け取る

JSON (jq)

CentOS 6.6 の場合は epel からインストール可能です。

$ sudo yum install epel-release
$ sudo yum --enablerepo=epel install jq

使用例 ('.' でルートを指定)

$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.'

[
  {
    "good": true,
    "name": "JSON"
  },
  {
    "good": false,
    "name": "XML"
  }
]

関連ページ『jq チートシート』もご参照ください。また jq が使用できない環境では perl に付属の json_pp コマンドの存在も確認します。

cat /path/to/xxx.json | json_pp

YAML ファイルをコマンドライン上でパース (shyaml)

macOS であれば brew コマンドでインストールできます。

brew install shyaml

以下のように値を取得できます。詳細はこちらをご参照ください。

test.yaml

name: "MyName !!"
subvalue:
    how-much: 1.1
    things:
        - first
        - second
        - third

コマンド例

cat test.yaml | shyaml keys
cat test.yaml | shyaml get-value name
cat test.yaml | shyaml get-value subvalue.how-much
cat test.yaml | shyaml get-value subvalue.things.0

ポートを使用しているプロセスを調査 (lsof, macOS でも可)

$ sudo lsof -i:3306
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  2314 mysql   14u  IPv6   9521      0t0  TCP *:mysql (LISTEN)

開いているポートを確認

sudo lsof | grep TCP | grep LISTEN
sudo lsof -P | grep TCP | grep LISTEN  ←ポート番号で強制表示

サーバー証明書チェーンの確認 (openssl s_client)

$ openssl s_client -connect www.qoosky.io:443 -showcerts > www.qoosky.io.crt

サーバー証明書 (一部抜粋したもの → server.crt)

 0 s:/OU=GT53696254/OU=See www.rapidssl.com/resources/cps (c)15/OU=Domain Control Validated - RapidSSL(R)/CN=www.qoosky.io
   i:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
-----BEGIN CERTIFICATE-----
MIIEqzCCA5OgAwIBAgIDBhQqMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMSAwHgYDVQQDExdSYXBpZFNTTCBTSEEy
NTYgQ0EgLSBHMzAeFw0xNTA4MDIwOTU3NTJaFw0xODEwMDMxMTM0MThaMIGSMRMw
EQYDVQQLEwpHVDUzNjk2MjU0MTEwLwYDVQQLEyhTZWUgd3d3LnJhcGlkc3NsLmNv
bS9yZXNvdXJjZXMvY3BzIChjKTE1MS8wLQYDVQQLEyZEb21haW4gQ29udHJvbCBW
YWxpZGF0ZWQgLSBSYXBpZFNTTChSKTEXMBUGA1UEAxMOd3d3LnFvb3NreS5uZXQw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbHL0Y+hMAD7PShvRJdQIr
9vFLF5mNEYaZvW+Zc/0FYCkqiWAXyYl76M6ZJlMUbDBSyTFB64BDuezNCKjsd6Uj
6g/PcE4AvJpteVcQiXKtuNRdBxj1brqidarRaGU+Not1twKXuwUffZf5nJVVAa63
EdTKnskAUWBNFwG423ami7lbe2P9fu3iOQDMbdz1yItt4p3p1NMyDoKRlN5IKkMB
jcd05947CTvSCfGD8f/tId4ovkkqTSimz/qGwu+11/65THobr8K26p28UnixYy3W
wys2WsB7rzW7vuztyxHMKyxsHix/uwFbk2VF6EIKh0B1wIJwpY40e0Ey8oF6mBI3
AgMBAAGjggFSMIIBTjAfBgNVHSMEGDAWgBTDnPP800YINLvORn+gfFvz4gjLWTBX
BggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9ndi5zeW1jZC5jb20w
JgYIKwYBBQUHMAKGGmh0dHA6Ly9ndi5zeW1jYi5jb20vZ3YuY3J0MA4GA1UdDwEB
/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwJQYDVR0RBB4w
HIIOd3d3LnFvb3NreS5uZXSCCnFvb3NreS5uZXQwKwYDVR0fBCQwIjAgoB6gHIYa
aHR0cDovL2d2LnN5bWNiLmNvbS9ndi5jcmwwDAYDVR0TAQH/BAIwADBBBgNVHSAE
OjA4MDYGBmeBDAECATAsMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5yYXBpZHNz
bC5jb20vbGVnYWwwDQYJKoZIhvcNAQELBQADggEBAC9QJx6LJ7OlEr0qPDbNIH0c
0PRVHBpabScIIAny770OPASRjDDneB278yD4AsAs4MISgIuiMZbzcSfxA65XfxIi
tCKHo/JUp4AlzGas09Q2GrZ4twXMlB4ppoGLhYK0VNHuGTvtquFIOrw/T9we7Qwn
3Fa+uWq/nj+hfEnV85FEwBbbTnecnOnY/rZnmLAmpq1A2yHRlNaNy/Fit0GUK9JA
c/s9FJyV1+AL+xTor4+L7D/mYfj3wpY+JUnYeoz111icrJBAdpC3Tk80WlrwGWg+
vC5UU3b9TdfZoaB2sOs9V+qz1yQADSs6HcEXCeN2Gy7uvcpVsp4Q6rC0pn/VABY=
-----END CERTIFICATE-----

中間証明書 (一部抜粋したもの → intermediate.crt)

 1 s:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg
U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv
VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp
SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS
1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ
DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM
QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp
YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7
qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD
VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF
MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry
dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs
rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp
fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B
kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH
uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O
ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh
gP8L8mJMcCaY
-----END CERTIFICATE-----

それぞれの署名アルゴリズムの確認などを個別に行えます。

$ openssl x509 -text -in server.crt | egrep '(Signature Algorithm|Subject|Issuer):'
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA - G3
Subject: OU=GT53696254, OU=See www.rapidssl.com/resources/cps (c)15, OU=Domain Control Validated - RapidSSL(R), CN=www.qoosky.io

$ openssl x509 -text -in intermediate.crt | egrep '(Signature Algorithm|Subject|Issuer):'
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
Subject: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA - G3

証明書チェーンは以下のようになっていることが分かりました。

www.qoosky.io ← RapidSSL SHA256 CA - G3 ← GeoTrust Global CA

tree コマンドがない場合は ls -R で代用

$ tree .
.
└── mydir
    └── myfile
$ ls -R
.:
mydir

./mydir:
myfile

SSH 先に綺麗にペーストする (vim set paste)

vim file.txt

でエディタを起動してから

:set paste

を設定します。

マウスコピーを vim で有効化する

:set mouse=v

読取専用の vim を起動 (view, vim -R)

view file.txt
vim -R file.txt

ネットワークの疎通確認 (nc)

nc (netcat) コマンドは TCP/UDP 通信の万能コマンドです。

ポートがあいているか確認

nmap のようにポートスキャンが行えます。

  • -z スキャンするだけで実際にデータを送信しない
  • -w タイムアウト時間を設定
  • -v 詳細な情報を出力する
  • -u UDP 通信を行う

TCP 80

$ nc -z -w 5 -v www.example.com 80

TCP 80-81

$ nc -z -w 5 -v www.example.com 80-81

UDP 68 (少なくともパケットが到達したら succeed となります。UDP は後述のサーバークライアントで疎通確認するとよいです)

$ nc -u -z -w 5 -v scanme.nmap.org 68
$ nc -u -z -w 5 -v dummy.example.com 68

簡易サーバーを立てる

コネクションが確立したら、どちらかのターミナルで 'test' などと打ち込みます。別のターミナルにそのまま出力されます。前述の通り、UDP の疎通確認に有用です。

  • -l 指定したポートをリッスンします
  • -u UDP で通信します

サーバー

$ nc -l 1234
$ nc -l -p 1234  ← Debian 等の場合は `-p` が必要です。

クライアント

$ nc 127.0.0.1 1234

memcached の stats をパイプで実行

$ echo 'stats' | nc 127.0.0.1 11211

仮想シリアルポートを TCP で二つのホストで共有 (socat)

socat を利用すると仮想シリアルポートを作成して TCP で二つのホストで共有できます。こちらのページに記載したキャラクタデバイス pts の作成です。

sudo apt install socat

サーバ側

socat pty,link=/tmp/mycom1,rawer tcp-listen:12345

クライアント側

socat pty,link=/tmp/mycom2,rawer tcp:127.0.0.1:12345

動作検証

cat < /tmp/mycom1
echo 'hi' > /tmp/mycom2

仮想ブロックデバイスファイルを TCP で別のホストに転送 (socat)

キャラクタデバイスであれば上記方法で双方向にシリアル通信できます。デバイスファイルの種類がブロックデバイスである場合は同様に socat を利用して以下のようにできます。ただし、双方向ではなく片方向の通信になります。

ブロックデバイスファイルに書き込む側

dd if=/dev/zero of=/dev/shm/myport bs=16K count=1  # shm; shared memory
socat -U TCP-LISTEN:12345,reuseaddr,fork OPEN:/dev/shm/myport

読み出す側

sudo /tmp/socat.bash &

/tmp/socat.bash

#!/bin/bash
while true; do socat -u TCP:127.0.0.1:12345 STDIO > /dev/myport; sleep 1; done &
tail -f /dev/null

パイプ時に改行を削除または置換 (tr)

tr で改行を操作した後に、他のコマンドの引数として使用すると便利です。

コマンド $(サブコマンド)

置換

$ echo $(echo -en '1\n2\n3' | tr '\n' ',')
1,2,3

削除

$ echo $(echo -en '1\n2\n3' | tr -d '\n')
123

置換してから sed で加工して足し算

$ expr $(echo -e '1\n2\n3' | tr '\n' ',' | sed 's/,$//' | sed 's/,/ + /g')
6

プロセスの優先度を変更する (nice, renice)

nice 値の既定は 0 です。nice 値が小さいプロセスほど CPU 時間を優先して割り当てられます。一般ユーザーは 0-19 の値を指定できます。root ユーザーは -20-19 の値を指定できます。nice 値 NI は ps の 'l' オプションまたは top コマンドで確認できます。PRI または PR は 20 + NI となっています。nice 値を変更したユーザープロセスによって使用された CPU 時間の割合は sar -u%nice 項目で確認できます。nice 値が上げられたプロセスは CPU 時間を割り当てられにくくなっているため TIME 項目の増加速度はゆるやかになります。

$ sleep 10 &
[1] 7166

$ ps lp 7166
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0   500  7166  7151  20   0 100908   616 hrtime S    pts/0      0:00 sleep 10

nice コマンドで実行

$ nice -n 19 sleep 10 &
[1] 7175

$ ps lp 7175
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0   500  7175  7151  39  19 100908   612 hrtime SN   pts/0      0:00 sleep 10

nice コマンドで実行 (root)

$ sudo su -l
# nice -n -20 sleep 10 &
[1] 7198

# ps lp 7198
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0  7198  7185   0 -20 100908   612 hrtime S<   pts/0      0:00 sleep 10

実行中のプロセスの nice 値を renice コマンドで変更

$ sleep 100 &
[1] 7252

$ ps lp 7252
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0   500  7252  7234  20   0 100908   616 hrtime S    pts/0      0:00 sleep 100

$ renice 19 -p 7252
7252: 古い優先度は 0、新たな優先度は 19 です

$ ps lp 7252
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0   500  7252  7234  39  19 100908   616 hrtime SN   pts/0      0:00 sleep 100

マルチスレッドのプロセスについては PID 指定で nice 値を変更しても、ps axml で確認するとメインスレッド以外のスレッドの nice 値は変化していないことが分かります。その場合は -g オプションを利用して PGID 指定で renice します。PGID は ps axjf で確認できます。

$ renice 19 -g `マルチスレッドのプロセスのPGID`

一定期間アクセスのないファイルを削除 (tmpwatch)

この続きが気になる方は

使い所が難しいマイナーな運用コマンド

残り文字数は全体の約 39 %
tybot
100 円
関連ページ
    概要 「何とかstat」というコマンドがたくさんあります。よく使うものの基本的な使用方法をまとめます。 iostat (I/Oデバイスの統計情報) システムが認識する各デバイスのI/Oの使用状況を調査するコマンドです。補足情報としてCPUの使用状況「%user, %system, %iowait, %idle」も合わせて出力されます。それらの意味については
    概要 Linux の標準機能として提供されている logrotate コマンドを利用すると、設定ファイルに記載された条件にしたがって特定のログファイルをリネームしたり古すぎるものを削除したりすることができます。これによってログファイルが肥大化してディスクの容量を圧迫することを回避できます。実用上 logrotate コマンド自体は直接的には実行しません。cron に設定されたシェルスクリプト内で
    概要 クロスルート証明書とは、中間証明書を署名したルート CA を更に別のルート CA が署名したものです。中間証明書を署名したルート CA の証明書がインストールされていないクライアントであっても、クロスルート証明書を署名したルート CA の証明書がインストールされていれば、サーバー証明書の信頼性を確認できます。
    概要 TCP/IP ソケットプログラミングについて、C 言語を用いた TCP クライアントの基本的なサンプルコードを記載します。 サンプルコード #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> // ソケット API を利用するため。 #include <unistd.h> //
    概要 プロセスの情報を取得および設定するためのシステムコールに関する、C 言語のサンプルコードです。 各種 ID プロセスID の取得 (getpid/getppid) コマンドラインから直接実行したプログラムの親プロセスはシェルになるため getppid() で取得されるプロセスID は と同じ値になります。
    概要 pcap (packet capture) というパケットキャプチャ用APIの実装には、UNIX系のlibpcapとWindowsのWinPcapがあります。これらのライブラリを利用したアプリケーションとしては、UNIX系のtcpdumpとWindowsのWiresharkが有名です。また、スクリプト言語にはlibpcap/WinPcapのラッパーが存在しており、パケットキャプチャアプリケ
    概要 こちらで公開されている stone という小型のツールを用いると、飛び石としてパケット転送を行う中継サーバを用意することができます。実際には多機能なツールですがここでは最も簡単な使用例を紹介します。 ビルド手順 ダウンロード 公式サイトから最新のもの stone version 2.3e をダウンロードします。
    概要 こちらのページで設定した k8s クラスタの各 Node マシンに GlusterFS サーバのコンテナを一つだけ起動して、簡単な分散ファイルシステムを構築します。各 Node へのコンテナ設置のためには DaemonSet が利用できそうですが、ここでは RancherOS の rancher.services
    概要 ファイル記述子 (File Descriptor) に関連するシステムコールを利用した C 言語のサンプルコードを記載します。 ファイルの読み書き open/close main.c #include <unistd.h> #include <fcntl.h> #include <stdio.h> int main() { int fd_r, fd_w; // 読
    概要 GNU Debugger (GDB) の簡単な使い方を記載します。 適宜参照するための公式ドキュメント 起動方法 main.cpp #include <iostream> #include <unistd.h> using namespace std; int main() { int i = 0; while(true) { sleep(1);
    概要 Docker に関するコマンド逆引き集です。公式ページの「Reference documentation」情報をもとにしています。 Docker 用語について コンテナ 後述のイメージという型をもとに作られる実体です。例えるならば、オブジェクト指向プログラミングにおけるクラスが Docker イメージで、インスタンスが Docker コンテナです。あるイメージをもとにして複数のコンテ
    概要 よく使う python ライブラリのサンプルコード集です。 JSON #!/usr/bin/python # -*- coding: utf-8 -*- import json arr = [1, 2, {'xxx': 3}] # オブジェクト ←→ JSON 文字列 jsonStr = json.dumps(arr) arr2 = json.loads(jsonStr) # オ
    概要 YOCTO Linux で開発している場合など、ビルド速度が開発効率にそのまま影響する際は ccache (compiler cache) で C/C++ ビルドを高速化することを考えます。cmake と併用する場合の設定およびコマンド例を記載します。 インストール sudo apt install ccache