Quando um processo foi iniciado

30

Para saber quando um processo foi iniciado, meu primeiro palpite foi verificar a hora em que /proc/<pid>/cmdline foi gravado / modificado na última vez.

ps também mostra um campo START . Eu pensei que ambas as fontes seriam as mesmas. Às vezes eles não são os mesmos. Como poderia ser?

    
por Swair 22.01.2013 / 13:04

2 respostas

42

No Linux, pelo menos, você também pode fazer:

ps -o lstart= -p the-pid

para ter um horário de início mais útil.

Note, entretanto, que é a hora em que o processo foi iniciado, não necessariamente na hora em que o comando que está sendo executado foi invocado. Os processos podem (e geralmente) executar mais de um comando durante sua vida útil. E os comandos às vezes geram outros processos.

Os tempos mtimes dos arquivos em /proc no Linux (pelo menos) são geralmente a data em que esses arquivos foram instanciados, o que seria a primeira vez que algo tentava acessá-los ou listar o conteúdo do diretório.

Por exemplo:

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

A expansão de /proc/$$/xx* fez com que o shell lesse o conteúdo de /proc/$$ , o que fez com que o arquivo cmdline fosse instanciado.

Veja também: Registro de data e hora do soquete em / proc // fd

    
por 22.01.2013 / 14:40
10

proc é um sistema de arquivos virtual, então eu não confiaria em nenhuma informação de status de arquivo.

A hora de início do processo está localizada na coluna / proc / PID / stat 22 . É dado em jiffies após o boot do sistema. Para convertê-lo em segundos, você tem que dividi-lo por sysconf(_SC_CLK_TCK) , que é 100 para os sistemas mais (mas não todos!).

Para obter o tempo de inicialização do sistema, você determina o tempo de atividade atual em segundos, que é o primeiro valor de / proc / uptime .

Tendo esses dois números, você subtrai o primeiro do segundo e recebe o número de segundos que se passaram desde o início do programa.

Exemplo (para pidgin ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

Nota: este exemplo simples não funciona se pidof devolver PIDs multipeças.

    
por 22.01.2013 / 13:34