w命令如何知道空闲时间和运行命令?


9

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

我知道,它会从第一个3个栏信息utmp和wtmp文件,这对每个人的读取权限,但它从哪里获得的信息空闲时间,什么用户目前正在做

ls -l $(which w)显示该w程序没有设置setuid位,并且作为普通用户,我无权查看中的其他进程/proc


在哪个操作系统上?Linux的?如果是这样,哪个发行版?(请记住,我们在这里介绍了所有Unix变体,并且细节因操作系统而异)。
derobert

我在Solaris上,但实际上我对了解UNIX所有变体的答案很感兴趣。我也使用Linux,据我所知,w不同版本之间的命令似乎差别不大。
user193130

Answers:


12

至少在Linux上,由于终端上的任何用户输入都将访问当前用户设备,因此它将进行stat()调用/dev/{tty,pts/}?*并检查是否atime有登录用户。

来自w.c

    /* 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在同一文件(wc)的getproc()函数中找到“ what”列。该函数扫描进程表,并根据控制终端和进程的开始时间(在Linux中,从/ proc文件系统开始)搜索“最佳”进程以报告为“(w)hat”。
nkms
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.