Quando um processo foi iniciado

31

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

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

Swair
fonte

Respostas:

44

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

ps -o lstart= -p the-pid

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

Observe, porém, que é a hora em que o processo foi iniciado, não necessariamente a hora em que o comando que está executando no momento foi chamado. Os processos podem (e geralmente o fazem) executar mais de um comando durante sua vida útil. E comandos às vezes geram outros processos.

Os horários dos arquivos no /procLinux (pelo menos) geralmente são a data em que esses arquivos foram instanciados, o que seria a primeira vez que algo tentaria 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 /proc/$$/xx*fez com que o shell lesse o conteúdo, /proc/$$causando a cmdlineinstanciação do arquivo.

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

Stéphane Chazelas
fonte
11

proc é um sistema de arquivos virtual, portanto, não confio em nenhuma informação de status do arquivo.

O horário de início do processo está localizado na coluna / proc / PID / stat 22 . É fornecido em instantes após a inicialização do sistema. Para convertê-lo em segundos, você deve dividir por sysconf(_SC_CLK_TCK)100 para a maioria dos sistemas (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 obtém o número de segundos passados ​​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 pidofretornar PIDs com várias faixas.

scai
fonte
Alguma idéia de quando é gravado proc / <pid> / cmdline? bem, qualquer uma das entradas proc / <pid> para esse assunto.
Swair
2
Geralmente esses arquivos são gerados pelo kernel dinamicamente sempre que você tenta lê-los e a maioria deles também possui um conteúdo dinâmico. O cmdline não funciona, mas não consigo imaginar que exista uma política oficial afirmando que deve ser criada uma vez na inicialização do processo e nunca mais ser tocada.
Scai
Você pode obter o valor _SC_CLK_TCK na linha de comando executando "getconf CLK_TCK"
22/09/18