w command shows odd idle time
新出@奈良女子大学でございます。
DebianのWoodyを使っているのですが、procpsのwコマンドがしばしば変な
IDLE timeを表示します。例えばこんな感じです:
$ w
21:54:29 up 4 days, 3:01, 12 users, load average: 0.73, 0.33, 0.11
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
nide ttyp0 :0.0 Fri11 0.00s 0.32s 0.00s -bash
nide ttyp1 :0.0 21:53 1284days 0.14s 0.14s -bash
立ち上げ後4日なのに、IDLEが1284日という…。
i686, sparc, ppcの3機種で使っていますが(カーネルはそれぞれで提供されて
いる2.4系の最新、procpsも最新)、いずれでもこうなります。
wのソースを見ると、IDLE timeはttyファイルのatimeと現在時刻の差から算出
しているようです。(w.cの関数idletime()から抜粋)
return time(NULL) - sbuf.st_atime;
ところがktermを起動してから全くキーインを行わないうちは、(なぜか)ttyの
atimeが変わらないので、atimeがすごく古い値を示してしまい、IDLE timeの算
出がおかしくなる、ということのようです。
$ ls -lau /dev/ttyp[01]
crw-rw-rw- 1 root tty 3, 4 9月 13 21:54 /dev/ttyp0
crw-rw-rw- 1 root tty 3, 12 3月 9 2001 /dev/ttyp1
他のシステムでもこんなものなんでしょうか?
とりあえずは、上記の箇所を
return time(NULL) - (sbuf.st_atime > sbuf.st_mtime ?
sbuf.st_atime : sbuf.st_mtime);
に直せば大丈夫なような気が(何となく)するのですが、これでもまずい場合って
あるでしょうか? 手元では今のところうまくいっているようです。(あるいは、
atimeとutmpから得たlogin timeの新しい方をtime(NULL)から引くのでもいいか
も知れない)
nide@ics.nara-wu.ac.jp
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735