Comment la commande `w` connaît-elle le temps d'inactivité et la commande en cours d'exécution?


8

La wcommande affiche un tas d'informations sur les utilisateurs connectés à ce qu'ils font.

Exemple de 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

Je sais qu'il obtient les informations des 3 premières colonnes de utmp et wtmp , qui a des autorisations de lecture pour tout le monde, mais où obtient-il les informations pour le temps d' inactivité et ce que l'utilisateur fait actuellement ?

ls -l $(which w)montre que le wprogramme n'a pas le bit setuid défini et en tant qu'utilisateur régulier, je n'ai pas la permission de voir d'autres processus dans /proc.


Sur quel système d'exploitation? Linux? et si oui, quelle distribution? (N'oubliez pas, nous couvrons toutes les variantes Unix ici, et les détails varient selon le système d'exploitation).
derobert

Je suis sur Solaris, mais je suis réellement intéressé à connaître la réponse pour toutes les variantes d'UNIX. J'utilise également Linux et d'après ce que je peux dire, la wcommande ne semble pas trop varier entre les variantes.
user193130

Réponses:


10

Sous linux au moins, puisque toute entrée utilisateur sur le terminal accédera à la machine utilisateur actuelle, elle fait un appel stat () à / dev / {tty, pts /}? * Et vérifie atime pour les utilisateurs connectés. De 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 () ne nécessite que les autorisations d'exécution (x) sur le répertoire parent pour fonctionner.


Ah l'heure modifiée du périphérique tty semble également être mise à jour sur Solaris lorsque j'exécute une commande, donc je pense que c'est aussi comme cela que cela se fait sur Solaris. Et la colonne "quoi"? Pourriez-vous créer un lien vers la source où vous l'avez trouvée w.c?
user193130

@ user193130 La source est à procps.sf.net La colonne "quoi" se trouve dans la fonction getproc () dans le même fichier (wc). La fonction analyse la table de processus et recherche le "meilleur" processus à signaler comme "(w) hat" en fonction du terminal de contrôle et de l'heure de début du processus (sous Linux à partir du système de fichiers / proc).
nkms
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.