¿Cómo sabe el comando `w` el tiempo de inactividad y el comando en ejecución?


8

El wcomando muestra un montón de información sobre quién inició sesión en lo que está haciendo.

Ejemplo 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

Sé que obtiene la información de las primeras 3 columnas de utmp y wtmp , que tiene permisos de lectura para todos, pero ¿de dónde obtiene la información para el tiempo de inactividad y lo que el usuario está haciendo actualmente ?

ls -l $(which w)muestra que el wprograma no tiene el bit setuid establecido y, como usuario normal, no tengo permiso para ver otros procesos /proc.


¿En qué sistema operativo? Linux? y si es así, ¿qué distribución? (Recuerde, cubrimos todas las variantes de Unix aquí, y los detalles varían según el sistema operativo).
derobert

Estoy en Solaris, pero en realidad estoy interesado en conocer la respuesta para todas las variantes de UNIX. También uso Linux y, por lo que puedo decir, el wcomando no parece variar demasiado entre las variantes.
user193130

Respuestas:


10

Al menos en Linux, dado que cualquier entrada de usuario en el terminal accederá al dispositivo de usuario actual, realiza una llamada stat () a / dev / {tty, pts /}? * Y comprueba el tiempo para los usuarios registrados. 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 () solo requiere permisos de ejecución (x) en el directorio padre para funcionar.


Ah, el tiempo modificado del dispositivo tty también parece actualizarse en Solaris cuando ejecuto un comando, por lo que creo que también es así en Solaris. ¿Qué pasa con la columna "qué"? ¿Podrías vincular a la fuente donde encontraste w.c?
user193130

@ user193130 La fuente está en procps.sf.net La columna "qué" se encuentra en la función getproc () en el mismo archivo (wc). La función escanea la tabla de procesos y busca el "mejor" proceso para informar como "(w) hat" según el terminal de control y el tiempo de inicio del proceso (en Linux desde el sistema de archivos / proc).
nkms
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.