プロセス関連のコマンド
[History] [Last Modified] (2018/10/30 15:41:13)
ここは
趣味のプログラミングを楽しむための情報共有サービス。記事の一部は有料設定にして公開できます。 詳しくはこちらをクリック📝
Recent posts
Popular pages

プロセスID関連 (ps, pgrep, pkill)

全プロセスを表示するためには

$ ps ax

とすればよく、その表示を見やすくするためには "u" と "w" を追加して

$ ps auxw

とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は

$ ps ax | grep 'my_script' | grep -v grep | awk '{print $1}'

とします。これを簡略化したコマンドが

$ pgrep -f 'my_script'

です。オプション " -l" を付与すれば詳細表示もできます。

$ pgrep -f 'my_script' -l

xargsと組み合わせると便利です。

$ pgrep -f 'my_script' | xargs kill

これを簡略化したコマンドが

$ pkill -f 'my_script'

です。

プロセス名からプロセス ID を調べる (pidof)

$ pidof nginx
25898 3193

$ ps auxw | grep nginx
root      3193  0.0  0.0  71100     0 ?        Ss   Jul15   0:00 nginx: master process /usr/sbin/nginx
nginx    25898  0.0  0.4  73108  4724 ?        S    Jul15  39:33 nginx: worker process
ec2-user 31085  0.0  0.0   9040   892 pts/0    S+   00:30   0:00 grep --color=auto nginx

プロセス名で kill、プロセスの死活監視 (killall)

sudo killall slapd

応用例として、シグナル0 を送ることでプロセスの死活監視が行えます。

$ sudo killall -0 slapd
$ echo $?
0

$ sudo killall -0 slapd2
slapd2: no process found
$ echo $?
1

プロセスの環境変数を調べる

sudo strings /proc/{調べたいプロセスのpid}/environ

カレントディレクトリの調査

以下のようなコマンドで調査できます。

$ sudo pwdx 1247
1247: /var/lib/mysql

$ sudo strings /proc/1247/environ | grep ^HOME
HOME=/var/lib/mysql

$ sudo readlink /proc/1247/cwd
/var/lib/mysql

$ sudo ls -l /proc/1247/cwd
lrwxrwxrwx. 1 mysql mysql 0 Aug 23 19:34 /proc/1247/cwd -> /var/lib/mysql

あるファイルリソースを開いているプロセスを表示 (lsof)

別の観点からプロセス一覧を表示するコマンドが "lsof" です。"list open files" の略で、「ファイル」「ネットワークソケット」「デバイス」「パイプ」などの "file" リソースとそれを使用しているプロセスの情報を一覧表示します。

mysqldのログファイルを開いているプロセス

$ sudo lsof /var/log/mysqld.log
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
mysqld    1087    mysql    1w      REG      253,0     6559     131408 /var/log/mysqld.log
mysqld    1087    mysql    2w      REG      253,0     6559     131408 /var/log/mysqld.log

TCPポートを開いているプロセス

$ sudo lsof | grep TCP
sshd       950     root    3u     IPv4      10445      0t0        TCP *:ssh (LISTEN)
sshd       950     root    4u     IPv6      10453      0t0        TCP *:ssh (LISTEN)
mysqld    1087    mysql   10u     IPv4      10910      0t0        TCP *:mysql (LISTEN)
master    1180     root   12u     IPv4      11116      0t0        TCP localhost:smtp (LISTEN)
master    1180     root   13u     IPv6      11118      0t0        TCP localhost:smtp (LISTEN)
httpd     1190     root    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1196   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1197   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1198   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1199   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1200   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1201   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1202   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
httpd     1203   apache    4u     IPv6      11248      0t0        TCP *:http (LISTEN)
sshd      1234     root    3r     IPv4      11618      0t0        TCP 192.168.56.10:ssh->192.168.56.1:56330 (ESTABLISHED)
sshd      1238 username    3u     IPv4      11618      0t0        TCP 192.168.56.10:ssh->192.168.56.1:56330 (ESTABLISHED)

スレッド数を表示

プロセスには少なくとも一つのスレッドがあります。スレッドが複数あると、複数のCPUコアで並列処理が可能になります。あるプロセスのスレッドを表示するためには 'm' をオプションで追加します。

Java プロセスのスレッド一覧を表示する例 (各スレッドの nice 値の確認)

$ ps axml | grep java -A10
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0   497  2399     1   -   - 1286256 109444 -    -    ?        123:32 /usr/bin/java -Xms256m -Xmx256m -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Delasticsearch -Des.pidfile=/var/run/elasticsearch/elasticsearch.pid -Des.path.home=/usr/share/elasticsearch -cp :/usr/share/elasticsearch/lib/elasticsearch-1.7.2.jar:/usr/share/elasticsearch/lib/*:/usr/share/elasticsearch/lib/sigar/* -Des.default.path.home=/usr/share/elasticsearch -Des.default.path.logs=/var/log/elasticsearch -Des.default.path.data=/var/lib/elasticsearch -Des.default.path.work=/tmp/elasticsearch -Des.default.path.conf=/etc/elasticsearch org.elasticsearch.bootstrap.Elasticsearch
0   497     -     -  20   0      -     - futex_ Sl   -          0:00 -
1   497     -     -  20   0      -     - futex_ Sl   -          0:02 -
1   497     -     -  20   0      -     - futex_ Sl   -          1:10 -
1   497     -     -  20   0      -     - futex_ Sl   -          2:27 -
1   497     -     -  20   0      -     - futex_ Sl   -          0:00 -
1   497     -     -  20   0      -     - futex_ Sl   -          0:00 -
1   497     -     -  20   0      -     - futex_ Sl   -          0:00 -
1   497     -     -  20   0      -     - futex_ Sl   -          0:00 -
1   497     -     -  20   0      -     - futex_ Sl   -          0:08 -
1   497     -     -  20   0      -     - futex_ Sl   -          0:07 -
--
0   500 29056 28857   -   - 114624   928 -      -    pts/1      0:00 grep java -A10
0   500     -     -  20   0      -     - pipe_w S+   -          0:00 -

Windowsのタスクマネージャでも「プロセス」タブを選択した状態で「表示」→「列の選択」をクリックし

Uploaded Image

「スレッド」にチェックを入れることで、各プロセスのスレッド数を表示できます。

Uploaded Image

カーネルが管理するプロセスの情報を閲覧する (procfs ファイルシステム)

procfs は "process filesystem" の意味で、/proc にマウントされる疑似ファイルシステムです。

$ grep "proc" /etc/fstab
proc  /proc  proc  defaults  0 0

$ mount | grep ^proc
proc on /proc type proc (rw)

"/proc/[PID]" というディレクトリには "PID" のプロセスに関する情報が格納されています。有用なものに "/proc/[PID]/status" ファイルがあります。例えば "Vm*" という行を定期的に監視することで、そのプロセスのメモリ使用量の変動を把握できます。

$ cat /proc/`pgrep -f '/usr/libexec/mysqld'`/status
Name:   mysqld
State:  S (sleeping)
Tgid:   1092
Pid:    1092
PPid:   989
TracerPid:      0
Uid:    27      27      27      27
Gid:    27      27      27      27
Utrace: 0
FDSize: 256
Groups: 27
VmPeak:   153144 kB
VmSize:   135744 kB     ←仮想メモリの使用容量
VmLck:         0 kB
VmHWM:     15344 kB
VmRSS:     15344 kB     ←物理メモリの使用容量
VmData:   120736 kB
VmStk:        88 kB
VmExe:      6788 kB
VmLib:      7212 kB
VmPTE:       120 kB
VmSwap:        0 kB
Threads:        10
SigQ:   0/3873
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000087007
SigIgn: 0000000000001000
SigCgt: 00000001800066e9
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   1
Cpus_allowed_list:      0
Mems_allowed:   1
Mems_allowed_list:      0
voluntary_ctxt_switches:        130
nonvoluntary_ctxt_switches:     11

参考

メモリ使用容量の監視が目的であれば、以下のようにしても同じです。関連ページは「pidstat (プロセスの統計情報)」および「topコマンドの基本的な使い方」です。

pidstat

$ pidstat -r -p `pgrep -f '/usr/libexec/mysqld'`
Linux 2.6.32-431.23.3.el6.i686 (localhost.localdomain)  2014年11月03日  _i686_  (1 CPU)
00時08分21秒       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
00時08分21秒      1092      0.12      0.00  135744  15344   3.00  mysqld

top

$ top -p `pgrep -f '/usr/libexec/mysqld'`
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1092 mysql     20   0  132m  14m 4532 S  0.0  3.0   0:10.37 mysqld

プロセスツリーの表示および PGID の確認

パイプで複数のコマンドをつなげたりクラスタ構成を組んだりすると、プロセスには親子関係が発生します。これをツリー状にまとめてプロレスグループとよび、PGID という ID で管理します。ps コマンドで PGID およびツリー構造の把握ができます。以下の例で nginx の master と worker について PID は異なりますが PGID は共通です。

$ ps axjf
PPID   PID   PGID  SID  TTY   TPGID STAT   UID   TIME COMMAND
...
   1   2598  2598  2598 ?        -1 Ss       0   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
 2598  2599  2598  2598 ?        -1 S      598  11:30  \_ nginx: worker process
Related pages
    概要 プロセスの情報を取得および設定するためのシステムコールに関する、C 言語のサンプルコードです。 各種 ID プロセスID の取得 (getpid/getppid) コマンドラインから直接実行したプログラムの親プロセスはシェルになるため getppid() で取得されるプロセスID は と同じ値になります。
    概要 こちらで公開されている stone という小型のツールを用いると、飛び石としてパケット転送を行う中継サーバを用意することができます。実際には多機能なツールですがここでは最も簡単な使用例を紹介します。 ビルド手順 ダウンロード 公式サイトから最新のもの stone version 2.3e をダウンロードします。
    バイナリファイルから文字列を抽出する (strings) 文字列らしい部分をバイナリファイルから抽出して出力するコマンドです。得体の知れないコマンドのオプションを調べたり strings /usr/bin/gcc | grep ^-- --help --target-help --sysroot= --all-warnings --ansi --assemble --assert --cla