使い所が難しいマイナーな運用コマンド
[履歴] [最終更新] (2017/07/01 01:16:10)
1
作品
364
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のためのハードウェア情報共有サイト

技術情報や作品の投稿機能、リアルタイム遠隔操作 API をご利用いただけます。
新着作品

バイナリファイルから文字列を抽出する (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

ファイルを横に連結 (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 は環境変数を一覧表示する機能だけでなく、実行時の環境変数を一時的に変更する機能も提供します。

$ 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

サーバ稼動時間を表示 (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

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 チートシート』もご参照ください。

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 を起動 (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 127.0.0.1 1234

memcached の stats をパイプで実行

$ echo 'stats' | nc 127.0.0.1 11211

パイプ時に改行を削除または置換 (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)

30 日間アクセスがないファイルを指定ディレクトリから削除するには以下のようにします。

sudo yum install tmpwatch
tmpwatch 30d /path/to/somewhere -v

/tmp/var/tmp のファイル削除は tmpwatch を利用した cron で実行されています。以下の例ではそれぞれ 10d, 30d で削除するようになっています。

/etc/cron.daily/tmpwatch

#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/tmp/hsperfdata_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \
        10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

アクセス日時ではなくファイル変更日時で判定するためには -m オプションを利用します。

tmpwatch 30d /path/to/somewhere -v -m

空になったディレクトリを削除しないためには -d オプションを利用します。

tmpwatch 30d /path/to/somewhere -v -d

特定のディレクトリを除外するためには -x オプションを利用します。

tmpwatch 30d /path/to/somewhere -v -x /path/to/somewhere/subdir

同じようなことは find コマンドでも実現できます。以下の二つは同じです。

tmpwatch 30d /path/to/somewhere -v -d -m
find /path/to/somewhere -type f -mtime +30 -exec rm -f {} \;

ディスク読み込み速度をチェックする (hdparm)

インストールされていない場合

$ sudo yum install hdparm

対象となるデバイスを確認

$ lsblk
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                          11:0    1 1024M  0 rom
sda                           8:0    0    8G  0 disk
├─sda1                        8:1    0  500M  0 part /boot
└─sda2                        8:2    0  7.5G  0 part
  ├─VolGroup-lv_root (dm-0) 253:0    0  6.7G  0 lvm  /
  └─VolGroup-lv_swap (dm-1) 253:1    0  816M  0 lvm  [SWAP]

/ にマウントされているデバイスを調査したい場合は sda デバイスを計測すればよいことが分かります。以下のコマンドを実行します。

$ sudo hdparm -t /dev/sda
/dev/sda:
 Timing buffered disk reads: 1348 MB in  3.00 seconds = 448.62 MB/sec

AWS において、自作の AMI から作成したルートボリュームや、スナップショットから作成した EBS ボリュームの読み書き速度が遅い場合があります。そのような場合は、一度以下のコマンドを実行することで改善する可能性があります。完了するまでに非常に時間がかかります。

$ sudo fio --filename=/dev/sda --rw=randread --bs=128k --iodepth=32 --ioengine=libaio --direct=1 --name=volume-initialize

ディスク書き込み速度をチェックする (dd)

ディスク容量を圧迫します。実行時は注意してください。

$ sudo dd if=/dev/zero of=/tmp/test.img bs=1M count=1024
268435456 bytes (268 MB) copied, 0.416738 s, 644 MB/s
  • if=/dev/zero → input file から 0 を読み出します
  • of=/tmp/test.img → 出力ファイル (output file)
  • bs=1M → 一度に書き込むバイト数
  • count=1024 → ブロック "bs=1M" をコピーする回数

ファイル作成時の read/write パーミッションを設定 (umask)

現在の設定を確認

$ umask
0002

設定を変更

$ umask 022  ← touch すると 644
$ umask 000  ← touch すると 666 (read/write をすべてのユーザーに許可)
$ umask 666  ← touch すると 000 (誰も read/write/execute できない)

改行コードを調査 (cat -e)

DOS 形式 ^M$ と UNIX 形式 $ のどちらであるかを調査できます。

cat -e filename.txt
関連ページ
    概要 「何とかstat」というコマンドがたくさんあります。よく使うものの基本的な使用方法をまとめます。 iostat (I/Oデバイスの統計情報) システムが認識する各デバイスのI/Oの使用状況を調査するコマンドです。補足情報としてCPUの使用状況「%user, %system, %iowait, %idle」も合わせて出力されます。それらの意味については
    概要 Linux の標準機能として提供されている logrotate コマンドを利用すると、設定ファイルに記載された条件にしたがって特定のログファイルをリネームしたり古すぎるものを削除したりすることができます。これによってログファイルが肥大化してディスクの容量を圧迫することを回避できます。実用上 logrotate コマンド自体は直接的には実行しません。cron に設定されたシェルスクリプト内で
    概要 クロスルート証明書とは、中間証明書を署名したルート CA を更に別のルート CA が署名したものです。中間証明書を署名したルート CA の証明書がインストールされていないクライアントであっても、クロスルート証明書を署名したルート CA の証明書がインストールされていれば、サーバー証明書の信頼性を確認できます。