Bagaimana perintah `w` mengetahui waktu idle dan perintah yang berjalan?

8

The wperintah menunjukkan sekelompok informasi tentang siapa yang login apa yang mereka lakukan.

Contoh dari 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

Saya tahu bahwa ia mendapat informasi 3 kolom pertama dari utmp dan wtmp , yang telah membaca izin untuk semua orang, tetapi dari mana ia mendapatkan informasi untuk waktu idle dan apa yang sedang dilakukan pengguna ?

ls -l $(which w)menunjukkan bahwa wprogram tidak memiliki set bit setuid dan sebagai pengguna biasa, saya tidak memiliki izin untuk melihat proses lain di /proc.

pengguna193130
sumber
Di sistem operasi mana? Linux? dan jika demikian, distro yang mana? (Ingat, kami membahas semua varian Unix di sini, dan detailnya berbeda tergantung pada OS).
derobert
Saya menggunakan Solaris, tetapi sebenarnya saya tertarik untuk mengetahui jawaban untuk semua varian UNIX. Saya juga menggunakan Linux dan dari apa yang saya tahu, wperintahnya sepertinya tidak terlalu bervariasi antar varian.
user193130

Jawaban:

10

Setidaknya di linux, karena setiap input pengguna pada terminal akan mengakses perangkat pengguna saat ini, ia melakukan panggilan stat () ke / dev / {tty, pts /}? * Dan memeriksa atime untuk pengguna yang masuk. Dari 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 () hanya membutuhkan eksekusi (x) izin pada direktori induk untuk bekerja.

nkms
sumber
Ah waktu modifikasi perangkat tty juga tampaknya diperbarui pada Solaris ketika saya menjalankan perintah, jadi saya pikir ini juga bagaimana hal itu dilakukan pada Solaris. Bagaimana dengan kolom "apa"? Bisakah Anda menautkan ke sumber tempat Anda menemukan w.c?
user193130
@ user193130 Sumbernya ada di procps.sf.net Kolom "apa" ditemukan di fungsi getproc () di file yang sama (wc). Fungsi memindai tabel proses dan mencari proses "terbaik" untuk dilaporkan sebagai "(w) topi" berdasarkan terminal pengontrol & waktu mulai proses (di linux dari sistem file / proc).
nkms