Como o comando `w` conhece o tempo ocioso e o comando em execução?


8

O wcomando mostra um monte de informações sobre quem está conectado no que está fazendo.

Exemplo da 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

Eu sei que ele obtém as informações das 3 primeiras colunas de utmp e wtmp , que têm permissões de leitura para todos, mas onde elas obtêm as informações em tempo ocioso e o que o usuário está fazendo atualmente ?

ls -l $(which w)mostra que o wprograma não possui o bit setuid definido e, como usuário comum, não tenho permissão para ver outros processos /proc.


Em qual sistema operacional? Linux? e se sim, qual distro? (Lembre-se, abordamos todas as variantes do Unix aqui e os detalhes diferem dependendo do sistema operacional).
Derobert 22/09

Estou no Solaris, mas estou realmente interessado em saber a resposta para todas as variantes do UNIX. Também uso o Linux e, pelo que sei, o wcomando não parece variar muito entre as variantes.
user193130

Respostas:


10

No linux, pelo menos, uma vez que qualquer entrada de usuário no terminal acessa o dispositivo de usuário atual, faz uma chamada stat () para / dev / {tty, pts /}? * E verifica atime para usuários logados. Partida 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);
...

O stat () requer apenas permissões de execução (x) no diretório pai para funcionar.


Ah, o tempo modificado do dispositivo tty também parece ser atualizado no Solaris quando executo um comando, então acho que também é assim que é feito no Solaris. E a coluna "o quê"? Você poderia criar um link para a fonte onde encontrou w.c?
User193130

@ user193130 A fonte está em procps.sf.net A coluna "what" é encontrada na função getproc () no mesmo arquivo (wc). A função varre a tabela de processos e procura o "melhor" processo a ser reportado como "(w) hat" com base no terminal de controle e na hora de início do processo (no linux, a partir do sistema de arquivos / proc).
Nkms 22/09/2015
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.