プロセス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のタスクマネージャでも「プロセス」タブを選択した状態で「表示」→「列の選択」をクリックし

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

カーネルが管理するプロセスの情報を閲覧する (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
$ 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
pstree コマンドでも同様のことが行えます。
pstree
GNOME ディスプレイマネージャー gdm の子プロセスのみを確認する例
pstree `pidof gdm3`
デバイス管理ツール udev のデーモンプロセス
pstree `pidof systemd-udevd`
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- 使い所が難しいマイナーな運用コマンドコマンドのエイリアスを登録する (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 /...
 - ipコマンドの基本的な使い方ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
 - rpmとyumのチートシート
rpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、... - メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
 - 運用時に大活躍する必須コマンドファイル内容を再帰的に検索 (grep) find コマンドはファイル名についてディレクトリを再帰的に検索します。ファイルの内容について指定したディレクトリ以下を再帰的に検索するためには grep に -r オプションを付与します。その際 -n および -i オプションも付与しておくと便利です。未来創発 NRI grep です。 $ grep -nri "pattern" dir -n (--li...
 





