Como obter o horário de início de um processo Linux de longa execução? [fechadas]

250

É possível obter a hora de início de um processo em execução antigo? Parece que psinformará a data (não a hora) se não foi iniciada hoje e apenas o ano se não foi iniciada este ano. A precisão é perdida para sempre em processos antigos?

ajwood
fonte
16
Há algo de errado em usar ps -p <pid> -o lstart? Parece que funciona, mas não sei por que não é a resposta óbvia imediata pelas muitas vezes em que essa pergunta surge.
ajwood
7
@ajwood Seria melhor usar ps -p <pid> -o lstart=para evitar linhas adicionais (cabeçalho) a serem impressas.
Vladimir Protasov
2
Há algo de errado em usar ps -p <pid> -o lstart? Talvez o fato de não haver lstartna edição de 2004 nem na edição de 2013 do padrão POSIX 1003.1?
Piotr Dobrogost
5
@PiotrDobrogost, isso seria um problema se a pergunta fosse feita sobre o POSIX, mas está perguntando sobre o Linux.
Womble
4
Mods - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - por que você não o move para um site mais apropriado, como StackExchange ou Superuser, em vez de fechar a pergunta? Esta é uma pergunta boa e útil
Hanxue 19/07/19

Respostas:

392

Você pode especificar um formatador e usar lstart, como este comando:

ps -eo pid,lstart,cmd

O comando acima produzirá todos os processos, com formatadores para obter o PID, a execução do comando e a data e hora iniciadas.

Exemplo (da linha de comando do Debian / Jessie)

$ ps -eo pid,lstart,cmd
  PID CMD                                          STARTED
    1 Tue Jun  7 01:29:38 2016 /sbin/init                  
    2 Tue Jun  7 01:29:38 2016 [kthreadd]                  
    3 Tue Jun  7 01:29:38 2016 [ksoftirqd/0]               
    5 Tue Jun  7 01:29:38 2016 [kworker/0:0H]              
    7 Tue Jun  7 01:29:38 2016 [rcu_sched]                 
    8 Tue Jun  7 01:29:38 2016 [rcu_bh]                    
    9 Tue Jun  7 01:29:38 2016 [migration/0]               
   10 Tue Jun  7 01:29:38 2016 [kdevtmpfs]                 
   11 Tue Jun  7 01:29:38 2016 [netns]                     
  277 Tue Jun  7 01:29:38 2016 [writeback]                 
  279 Tue Jun  7 01:29:38 2016 [crypto]                    
      ...

Você pode ler psa página de manual ou verificar a página do Opengroup para outros formatadores.

wkl
fonte
3
@ bobbyrne01: mude a ordem, por exemplo, pid, etime, cmd funciona para mim no Debian Wheezy.
Exic
1
Gobliins - etimeé o tempo decorrido desde que o processo foi iniciado.
Wkl
4
Para completar, para aqueles acostumados a sintaxe BSD: ps axo pid,cmd,lstarttambém funciona
Graeme Moss
2
@ bobbyme01: usar a opção WW
Ed Randall
1
Esteja ciente de que o lstarttempo pode mudar, os statmétodos abaixo são mais seguros - unix.stackexchange.com/questions/274610/… .
SLM
43

O comando ps (pelo menos a versão procps usada por muitas distribuições Linux) possui vários campos de formato relacionados à hora de início do processo, incluindo os lstartque sempre fornecem a data e a hora completas do processo:

# ps -p 1 -wo pid,lstart,cmd
  PID                  STARTED CMD
    1 Mon Dec 23 00:31:43 2013 /sbin/init

# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER       PID %CPU %MEM    VSZ   RSS TT       STAT                  STARTED CMD
root         1  0.0  0.1   2800  1152 ?        Ss   Mon Dec 23 00:31:44 2013 /sbin/init
root      5151  0.3  0.1   4732  1980 pts/2    S    Sat Mar  8 16:50:47 2014 bash

Para uma discussão sobre como as informações são publicadas no sistema de arquivos / proc, consulte /unix/7870/how-to-check-how-long-a-process-has-been-running

(Na minha experiência no Linux, o registro de data e hora nos diretórios / proc / parece estar relacionado a um momento em que o diretório virtual foi acessado recentemente, em vez da hora de início dos processos:

# date; ls -ld /proc/1 /proc/$$ 
Sat Mar  8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151

Observe que, neste caso, executei um comando "ps -p 1" por volta das 16:50, depois gerei um novo shell bash e, em seguida, executei o comando "ps -p 1 -p $$" dentro desse shell logo depois ... .)

Nathan
fonte
Para ver todos os processos (e não apenas o seu próprio) adicionar uma e(padrão psde sintaxe) ou axargumento (sintaxe BSD) para o comando ps: ou seja, ps -ewo pid,lstart,cmdoups -axwo pid,lstart,cmd
Ryan Griffith
15

Como acompanhamento da resposta de Adam Matan , o /proc/<pid>carimbo de data / hora do diretório não é necessariamente diretamente útil, mas você pode usar

awk -v RS=')' 'END{print $20}' /proc/12345/stat

para obter a hora de início do relógio desde a inicialização do sistema. 1

Esta é uma unidade um pouco complicada de usar; consulte também converter jiffies em segundos para obter detalhes.

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat

Isso deve fornecer segundos para os quais você pode passar strftime()para obter um carimbo de data / hora (legível por humanos ou não).

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat

Atualizado com algumas correções de Stephane Chazelas nos comentários; obrigado como sempre!

Se você só tem Mawk, talvez tente

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 homem proc ; procure o horário de início .

triplo
fonte
Ligeiramente reformulado para uso em produção: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee
1
Tenha em mente que o strftime()e systime()não está presente mawk, o que é o padrão awknas minhas imagens do Debian 8 VPS, então eu posso apenas assumir que elas são específicas para gawko dialeto do.
Ssokolow
13
ls -ltrh /proc | grep YOUR-PID-HERE

Por exemplo, o PID do meu Google Chrome é 11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583
Adam Matan
fonte
6
Isso não funciona para mim - ele imprime tempo de modificação (muda frequentemente) Talvez por isso: unix.stackexchange.com/questions/20460/...
user920391
O registro de data e hora do / proc / <pid> não é confiável.
Henning
1
Isso retornou um tempo 9 minutos depois do que quando um processo sobre o qual eu tenho informações realmente foi iniciado.
Dan Dascalescu
1
Esta parece ser minha única opção que funciona, embora talvez não seja confiável. Estou em um sistema embarcado que possui apenas o busybox, o psque indica invalid optiontodas as opções mencionadas por outras respostas.
Qi Fan
7
Por que grep? Por que não ls -ldh /proc/$pid? Ou melhor ainda date -r /proc/$pid?
Caesar
6
 ps -eo pid,etime,cmd|sort -n -k2
bash-o-logist
fonte
6
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Stackoverflow
fonte
1
Isso irá incluir o seu próprio processo também
Paul Verschoor