プロセスの管理やシステムの監視ができるprocps-ngパッケージのコマンドのひとつになります。
目次
現在ログインしているユーザとその実行中のプロセスの確認
wコマンドで表示される項目の一番上の行は
- 現在の時刻とシステム稼働時間
- ログイン中のユーザ数
- CPUの平均負荷(1分、5分、15分)
になります。
次の行から
- ユーザ
- TTY(端末)
- どこからのアクセスか(リモートからのアクセスの場合)
- ログインしたときの時間
- アイドル時間
- その端末で実行している全プロセスが使用した時間
- 端末で実行している現在のプロセス(WHATフィールド)が使用した時間
が表示されます。
1 2 3 4 5 6 |
$ w 11:10:58 up 26 min, 3 users, load average: 0.00, 0.00, 0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT sshtest tty1 - 11:09 8.00s 0.13s 0.03s /usr/bin/python3 ./loop.py s2user1 pts/0 stepserver 11:08 1.00s 0.11s 0.00s w sshtest tty2 - 11:10 37.00s 0.09s 0.08s -bash |
ttyはteletypewriter(テレタイプライター),ptsはpseudo-terminal(疑似端末)の略になります。
ttyは標準入出力となっている制御端末で、ptsはSSHなどでログインすると接続される端末になります。
指定したユーザのみを表示
wコマンドは引数にユーザを指定するとその指定したユーザの情報のみを表示します。
複数のユーザを指定する場合は、引数を増やして列挙していくことで指定できます。
1 2 3 4 |
$ w s2user1 13:03:55 up 2:19, 3 users, load average: 2.00, 2.00, 2.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT s2user1 pts/0 stepserver 12:56 3.00s 0.10s 0.00s w s2user1 |
ヘッダー行を表示しない(-hオプション)
-hオプションを用いるとヘッダー行が表示されなくなります。
1 2 3 4 |
$ w -h sshtest tty1 - 11:09 2:34 0.15s 0.05s /usr/bin/python3 ./loop.py s2user1 pts/0 stepserver 11:08 1.00s 0.11s 0.00s w -h sshtest tty2 - 11:10 3:03 0.09s 0.08s -bash |
sortやgrep等のコマンドを利用したいときに用いると便利なオプションです。
1 2 |
$ w -h | grep s2user1 s2user1 pts/0 stepserver 11:08 4.00s 0.11s 0.00s w -h |
表示するプロセスを現在のユーザで判断しない(-uオプション)
sshtestという名前のユーザで、s2user1のユーザにsuコマンドでユーザを切り替え、loop.pyというプログラムを操作すると、wコマンドのWHATフィールドはどのような表示をするでしょうか?
1 2 3 4 5 6 7 8 |
$ whoami sshtest $ su s2user1 Password: $ whoami s2user1 $ $ ./loop.py |
suコマンドで別のユーザ切り替えた後に操作する場合、wコマンドが表示するプロセスとしては主に実行させているloop.pyを表示することを期待しますが、別のプロセスが表示されます。例えば、SSH上で上記のコマンドを実行した後に、さらに別の端末で続けて、SSHでログインし、wコマンドと'w -u'コマンドを実行してみます。
1 2 3 4 5 6 7 8 9 10 |
$ w; echo; w -u 12:37:58 up 1:53, 2 users, load average: 2.00, 2.00, 2.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT s2user1 pts/0 stepserver 11:08 1.00s 0.19s 0.00s w sshtest pts/1 stepserver 12:25 10:54 0.19s 0.01s sshd: sshtest [priv] 12:37:58 up 1:53, 2 users, load average: 2.00, 2.00, 2.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT s2user1 pts/0 stepserver 11:08 1.00s 0.19s 0.00s w -u sshtest pts/1 stepserver 12:25 10:54 0.19s 0.05s /usr/bin/python3 ./loop.py |
比較すると、-uオプションを利用しない場合では、プロセスが'sshd:~'のようになっていますが、-uオプションを利用すると、loop.pyが表示されています。
wコマンドは、ログインセッションで関連付けられているプロセスをCPU時間などを用いて、表示するプロセスが適切となるように表示します。ユーザを切り替えてプログラムを起動させても、通常はログインユーザのプロセスが表示されます。
wコマンドでログインユーザのプロセスとしては実行していないプロセスを表示したい場合は-uオプションを用います。-uオプションを用いると表示するプロセスをユーザで判断しなくなります。つまり、ユーザを切り替えてプログラムを起動している場合でも、ログインユーザがどのようなプロセスを主に実行しているかを知ることができます。
短い形式で表示する(-sオプション)
-sオプションを用いるとCPU時間が省略されます。
1 2 3 4 5 6 |
$ w -s 12:57:29 up 2:12, 3 users, load average: 2.04, 2.01, 2.00 USER TTY FROM IDLE WHAT sshtest tty1 - 1:45 /usr/bin/python3 ./loop.py s2user1 pts/0 stepserver 1.00s w -s sshtest tty2 - 40.00s -bash |
FROMフィールドの表示を切り替える(-fオプション)
-fオプションを用いるとFROMフィールドの表示を切り替えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ w; echo; w -f 13:00:19 up 2:15, 3 users, load average: 2.00, 2.00, 2.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT sshtest tty1 - 12:55 4:35 0.14s 0.04s /usr/bin/python3 ./loop.py s2user1 pts/0 stepserver 12:56 3.00s 0.09s 0.00s w sshtest tty2 - 12:56 3:30 0.10s 0.08s -bash 13:00:19 up 2:15, 3 users, load average: 2.00, 2.00, 2.00 USER TTY LOGIN@ IDLE JCPU PCPU WHAT sshtest tty1 12:55 4:35 0.14s 0.04s /usr/bin/python3 ./loop.py s2user1 pts/0 12:56 3.00s 0.09s 0.00s w -f sshtest tty2 12:56 3:30 0.10s 0.08s -bash |
FROMフィールドをipアドレス表示にする(-iオプション)
-iオプションを用いるとFROMフィールドをipアドレス表示にすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ w; echo; w -i 13:01:34 up 2:17, 3 users, load average: 2.00, 2.00, 2.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT sshtest tty1 - 12:55 5:50 0.14s 0.04s /usr/bin/python3 ./loop.py s2user1 pts/0 stepserver 12:56 3.00s 0.09s 0.00s w sshtest tty2 - 12:56 4:45 0.10s 0.08s -bash 13:01:34 up 2:17, 3 users, load average: 2.00, 2.00, 2.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT sshtest tty1 - 12:55 5:50 0.14s 0.04s /usr/bin/python3 ./loop.py s2user1 pts/0 192.168.0.101 12:56 3.00s 0.09s 0.00s w -i sshtest tty2 - 12:56 4:45 0.10s 0.08s -bash |
SSHログイン時にFROMフィールドが元々ipアドレスしか表示されない場合は、IPアドレスからの逆引きがうまくいっていない可能性があります。例えば、/etc/ssh/sshd_configで"useDNS:yes"になっていない場合があります。useDNSはIPアドレスの逆引きを行う設定になります。ただし、この設定はSSH接続時に何らかのトラブルで逆引きに失敗してしまうとタイムアウトされるまで接続が待たされる可能性があるので、"useDNS:no"になっている方が都合が良い場合があります。
また別の理由を考える場合、/var/run/utmpのデータベース情報が利用されているので、このデータベースに関係した/var/log/wtmpのログを確認しても良いかもしれません。
これはログイン時とログアウト時のユーザ情報を記録したものでutmpdumpコマンドで確認できます。以下は確認する例になります。
1 2 3 4 5 |
s2user1@sshtest:~$ utmpdump /var/log/wtmp | tail -n3 Utmp dump of /var/log/wtmp [7] [02983] [ts/0] [s2user1 ] [pts/0 ] [192.168.0.101 ] [192.168.0.101 ] [2021-01-16T20:51:28,730910+0000] [8] [02983] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [2021-01-16T20:52:04,858763+0000] [7] [03052] [ts/0] [s2user1 ] [pts/0 ] [stepserver ] [192.168.0.101 ] [2021-01-16T20:52:06,605579+0000] |