wコマンド

wはログイン中のユーザーと、そのユーザーが何をしているかを表示するコマンド。whoが接続元と時刻を並べるだけなのに対し、wは実行中のコマンドやCPU時間まで表示する。

$ w
 10:56:36 up 17 days, 14:05,  3 users,  load average: 0.96, 0.60, 0.31
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
carol    pts/0    192.168.10.42    10:55    1:35   1:34   1:34  gzip -9 -c /dev/zero
alice    pts/1    192.168.10.21    10:55    1:35   0.00s  0.00s -bash
bob      pts/2    192.168.10.35    10:55    1:35   0.00s  0.00s tail -f /var/log/messages

1行目はuptimeと同じ内容で、現在時刻、起動からの経過時間、ログイン中のユーザー数、ロードアベレージを表示する。

なお、Rocky LinuxなどのRHEL系ではFROM列がデフォルトで表示されない。接続元を表示するには後述の-fを付ける。

各列の意味

  • USER: ログイン中のユーザー名
  • TTY: 端末名。pts/0はSSHなどの擬似端末、tty1はコンソール
  • FROM: 接続元のホスト名やIPアドレス
  • LOGIN@: ログインした時刻
  • IDLE: 端末が操作されていない時間
  • JCPU: その端末に紐づくプロセス全体が使ったCPU時間。実行中のバックグラウンドジョブは含み、終了済みのジョブは含まない
  • PCPU: WHAT列のプロセスが使ったCPU時間
  • WHAT: 現在実行中のコマンド

上の例では、carolgzipでCPUを1分34秒消費している。aliceのWHATは-bashであり、シェルを開いたまま何も実行していない。IDLEが1時間や1日に達しているセッションは、接続したまま放置されている。

JCPUとPCPUの違いはcarolの行のように単独のコマンドを実行中だと分かりにくい。パイプや複数のコマンドを実行した端末では、JCPUがその端末で使った合計、PCPUが今動いているコマンドの分だけになる。

ヘッダーを消す(-h)

-h(--no-header)を付けると、1行目のヘッダーと列見出しを省略する。

$ w -h
carol    pts/0    192.168.10.42    10:55    1:35   1:34   1:34  gzip -9 -c /dev/zero
alice    pts/1    192.168.10.21    10:55    1:35   0.00s  0.00s -bash
bob      pts/2    192.168.10.35    10:55    1:35   0.00s  0.00s tail -f /var/log/messages

grepやwc -lと組み合わせる場合に使う。

$ w -h | wc -l
3

短い形式で表示する(-s)

-s(--short)はLOGIN@、JCPU、PCPUを省略する。誰が何をしているかだけを見たい場合に適している。

$ w -s
 10:56:36 up 17 days, 14:05,  3 users,  load average: 0.96, 0.60, 0.31
USER     TTY      FROM              IDLE WHAT
carol    pts/0    192.168.10.42     1:35  gzip -9 -c /dev/zero
alice    pts/1    192.168.10.21     1:35  -bash
bob      pts/2    192.168.10.35     1:35  tail -f /var/log/messages

接続元の表示を切り替える(-f)

-f(--from)はFROM列の表示を切り替えるトグルである。デフォルトの状態はディストリビューションのビルド設定によって異なるため、同じオプションでも効果が逆になる。

  • Rocky Linux 9などのRHEL系: デフォルトではFROM列が出ないため、w -fで表示する
  • Debian系やUbuntu: デフォルトでFROM列が出るため、w -fで非表示になる

Rocky Linux 9で-fを付けない場合の出力は以下のとおり。

 10:56:36 up 17 days, 14:05,  3 users,  load average: 0.96, 0.60, 0.31
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
carol    pts/0     10:55    1:35   1:34   1:34  gzip -9 -c /dev/zero
alice    pts/1     10:55    1:35   0.00s  0.00s -bash
bob      pts/2     10:55    1:35   0.00s  0.00s tail -f /var/log/messages

IPアドレスで表示する(-i)

-i(--ip-addr)はFROM列をホスト名ではなくIPアドレスで表示する。名前解決の結果ではなく実際の接続元を確認したい場合に使う。

$ w -i

特定のユーザーだけ表示する

引数にユーザー名を渡すと、そのユーザーのセッションだけを表示する。

$ w alice
 10:56:36 up 17 days, 14:05,  3 users,  load average: 0.96, 0.60, 0.31
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
alice    pts/1    192.168.10.21    10:55    1:35   0.00s  0.00s -bash

ヘッダーのユーザー数は絞り込みの影響を受けず、システム全体の数のままである。

実行中のコマンドのPIDを表示する(-p)

新しいバージョンのprocps-ngには-p(--pids)がある。WHAT列の先頭に968/983のような形式でPIDが付き、ログインプロセス(セッションリーダー)と実行中のプロセスのPIDを確認できる。プロセスを特定してからkillする場合に役立つ。

$ w -p

利用できるかはバージョン次第である。Debian 13のprocps-ng 4.0.4では使えるが、Rocky Linux 9のprocps-ng 3.3.17には-pが無い。バージョンはw --versionで確認する。

$ w --version
w from procps-ng 3.3.17

whoやlastとの使い分け

3つのコマンドは見る対象が異なる。

コマンド対象分かること
w現在のセッションログイン中のユーザーと実行中のコマンド
who現在のセッションログイン中のユーザーと接続元、ログイン時刻
last過去の履歴誰がいつログイン・ログアウトしたか

サーバーの負荷が高い場合、wで誰が重い処理を実行しているかを最初に確認できる。

参考