Làm thế nào để lệnh `w` biết thời gian nhàn rỗi và lệnh đang chạy?


8

Các wlệnh cho thấy một loạt các thông tin về những người đăng nhập trong những gì họ đang làm.

Ví dụ từ Wikipedia :

$ 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

Tôi biết rằng nó được thông tin 3 cột đầu tiên từ utmp và wtmp , trong đó có quyền đọc cho mọi người, nhưng nơi nào nó có được các thông tin cho nhàn rỗi thời gian và những gì người dùng đang thực hiện ?

ls -l $(which w)cho thấy wchương trình không có tập bit setuid và với tư cách là người dùng thông thường, tôi không có quyền xem các quy trình khác /proc.


Trên hệ điều hành nào? Linux? và nếu vậy, distro nào? (Hãy nhớ rằng, chúng tôi bao gồm tất cả các biến thể Unix ở đây và các chi tiết khác nhau tùy thuộc vào HĐH).
derobert

Tôi đang ở trên Solaris, nhưng tôi thực sự muốn biết câu trả lời cho tất cả các biến thể của UNIX. Tôi cũng sử dụng Linux và từ những gì tôi có thể nói, wlệnh dường như không thay đổi quá nhiều giữa các biến thể.
dùng193130

Câu trả lời:


10

Ít nhất là trên linux, vì bất kỳ đầu vào nào của người dùng trên thiết bị đầu cuối sẽ truy cập vào thiết bị người dùng hiện tại, nó thực hiện một cuộc gọi stat () tới / dev / {tty, pts /}? * Và kiểm tra thời gian cho người dùng đã đăng nhập. Từ wc:

/* 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 () chỉ yêu cầu quyền thực thi (x) trên thư mục cha để hoạt động.


Thời gian sửa đổi của thiết bị tty dường như cũng được cập nhật trên Solaris khi tôi thực thi một lệnh, vì vậy tôi nghĩ đây cũng là cách nó được thực hiện trên Solaris. Còn cột "cái gì" thì sao? Bạn có thể liên kết đến nguồn nơi bạn tìm thấy w.c?
dùng193130

@ user193130 Nguồn có tại Procps.sf.net Cột "what" được tìm thấy trong hàm getproc () trong cùng một tệp (wc). Hàm quét bảng quy trình và tìm kiếm quy trình "tốt nhất" để báo cáo là "(w) hat" dựa trên thiết bị đầu cuối kiểm soát và thời gian bắt đầu quá trình (trong linux từ hệ thống tập tin / Proc).
nkms
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.