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.