`w`コマンドはアイドル時間と実行中のコマンドをどのように知るのですか?


8

このwコマンドは、誰が何をしてログインしているかについての一連の情報を表示します。

ウィキペディアの例:

$ w
 11:12am up 608 day(s), 19:56,  6 users,  load average: 0.36, 0.36, 0.37
User     tty       login@  idle  what
smithj   pts/5      8:52am       w
jonesm   pts/23    20Apr06    28 -bash
harry    pts/18     9:01am     9 pine
peterb   pts/19    21Apr06       emacs -nw html/index.html
janetmcq pts/8     10:12am 3days -csh
singh    pts/12    16Apr06  5:29 /usr/bin/perl -w perl/test/program.pl

すべての人に読み取り権限があるutmpとwtmpから最初の3列の情報を取得することは知っていますが、アイドル時間とユーザーが現在行っていることに関する情報はどこで取得しますか?

ls -l $(which w)は、wプログラムにsetuidビットが設定されておらず、通常のユーザーとして、の他のプロセスを表示する権限がないことを示しています/proc


どのオペレーティングシステムで Linux?もしそうなら、どのディストリビューション?(ここではすべてのUnixバリアントをカバーし、詳細はOSによって異なります)。
derobert

私はSolarisを使用していますが、UNIXのすべてのバリアントの答えを知りたいと思っています。私もLinuxを使用しており、私が言えることは、wコマンドがバリアント間であまり大きく変化していないようです。
user193130

回答:


10

少なくともLinuxでは、端末でのユーザー入力は現在のユーザーデバイスにアクセスするため、/ dev / {tty、pts /}?*へのstat()呼び出しを行い、ログインしているユーザーのatimeをチェックします。トイレから:

/* stat the device file to get an idle time */
static time_t idletime(const char *restrict const tty)
{
        struct stat sbuf;
        if (stat(tty, &sbuf) != 0)
                return 0;
        return time(NULL) - sbuf.st_atime;
}

static void showinfo(utmp_t * u, int formtype, int maxcmd, int from,
...
        print_time_ival7(idletime(tty), 0, stdout);
...

stat()が機能するには、親ディレクトリに対する実行(x)権限のみが必要です。


コマンドラインを実行すると、ttyデバイスの変更時刻もSolarisで更新されるように見えるので、これはSolarisでの実行方法でもあると思います。「何」の列はどうですか?見つけたソースにリンクしていただけませんw.cか?
user193130

@ user193130ソースはprocps.sf.netにあります。「what」列は、同じファイル(wc)のgetproc()関数にあります。この関数はプロセステーブルをスキャンし、制御端末とプロセスの開始時間(Linuxでは/ procファイルシステムから)に基づいて「(w)hat」としてレポートする「最適な」プロセスを検索します。
nkms
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.