全プロセスを表示するためには
$ 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'
です。
$ 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
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" です。"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のタスクマネージャでも「プロセス」タブを選択した状態で「表示」→「列の選択」をクリックし
「スレッド」にチェックを入れることで、各プロセスのスレッド数を表示できます。
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 という 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
pstree コマンドでも同様のことが行えます。
pstree
GNOME ディスプレイマネージャー gdm
の子プロセスのみを確認する例
pstree `pidof gdm3`
デバイス管理ツール udev
のデーモンプロセス
pstree `pidof systemd-udevd`