Woher kennt der Befehl `w` die Leerlaufzeit und den laufenden Befehl?


8

Der wBefehl zeigt eine Reihe von Informationen darüber an, wer angemeldet ist, was er tut.

Beispiel aus 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

Ich weiß, dass es die Informationen der ersten 3 Spalten von utmp und wtmp erhält , die Leseberechtigungen für alle haben, aber woher erhält es die Informationen für die Leerlaufzeit und was der Benutzer gerade tut ?

ls -l $(which w)zeigt, dass für das wProgramm das Setuid-Bit nicht gesetzt ist und ich als normaler Benutzer keine Berechtigung habe, andere Prozesse in zu sehen /proc.


Auf welchem ​​Betriebssystem? Linux? und wenn ja, welche Distribution? (Denken Sie daran, dass wir hier alle Unix-Varianten behandeln und die Details je nach Betriebssystem unterschiedlich sind.)
Derobert

Ich bin auf Solaris, aber ich bin tatsächlich daran interessiert, die Antwort für alle UNIX-Varianten zu erfahren. Ich benutze auch Linux und soweit ich das beurteilen kann, wscheint der Befehl zwischen den Varianten nicht zu stark zu variieren.
user193130

Antworten:


10

Zumindest unter Linux führt jeder Benutzereingang auf dem Terminal einen stat () -Aufruf an / dev / {tty, pts /}? * Durch und sucht nach dem Zeitpunkt für angemeldete Benutzer, da er auf das aktuelle Benutzergerät zugreift. Von 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);
...

Für stat () sind nur Ausführungsberechtigungen (x) für das übergeordnete Verzeichnis erforderlich.


Ah, die geänderte Zeit des tty-Geräts scheint auch unter Solaris aktualisiert zu werden, wenn ich einen Befehl ausführe. Ich denke, dies geschieht auch unter Solaris. Was ist mit der Spalte "Was"? Könnten Sie auf die Quelle verlinken, in der Sie gefunden haben w.c?
user193130

@ user193130 Die Quelle befindet sich in procps.sf.net. Die Spalte "what" befindet sich in der Funktion getproc () in derselben Datei (wc). Die Funktion durchsucht die Prozesstabelle und sucht nach dem "besten" Prozess, der als "(w) hat" gemeldet werden soll, basierend auf dem steuernden Terminal und der Startzeit des Prozesses (unter Linux aus dem / proc-Dateisystem).
nkms
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.