Observe que lstart
não é uma das colunas padrão% Unixps
.
Nem todos os sistemas têm um e a saída varia entre implementações e potencialmente entre locais.
Por exemplo, no FreeBSD ou com o ps
de procps-ng
(como normalmente é encontrado em sistemas baseados no Linux não embarcados) e o C
locale, você terá:
Wed Nov 1 12:36:15 2017
No macOS:
Wed 1 Nov 12:36:15 2017
Além disso, como não fornece o deslocamento GMT, a saída é ambígua em fusos horários que implementam DST (onde há uma hora durante o ano em que as mesmas datas ocorrem duas vezes) e nem sempre são ordenadas cronologicamente.
Aqui, você pode forçar os horários a serem UTC e usar o perl
' Date::Manip
module para analisar a data de maneira que entenda diferentes formatos naturais:
(export TZ=UTC0 LC_ALL=C
ps -A -o lstart= -o pid= -o args= |
perl -MDate::Manip -lpe '
s/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e' |
sort
)
Ou com ksh93
, que também reconhece esses formatos de data:
(export TZ=UTC0 LC_ALL=C
unset -v IFS
ps -A -o lstart= -o pid= -o args= |
while read -r a b c d e rest; do
printf '%(%FT%T+00:00)T %s\n' "$a $b $c $d $e" "$rest"
done
)
(cuidado, retira espaços em branco de cada linha)
Ou com zsh
e GNU date
:
(export LC_ALL=C TZ=UTC0
(){
paste -d '(export LC_ALL=C TZ=UTC0
{
paste -d '$ sh -c 'sleep 4; exec sleep 123' & sleep 234 & sleep 5
[1] 9380
[2] 9381
$ (export TZ=UTC0 LC_ALL=C; ps -o lstart,pid,args | perl -MDate::Manip -lpe 's/^(\s*\S+){5}/UnixDate(ParseDate($&), "%Y-%m-%dT%T+00:00")/e')
2017-10-30T17:21:06+00:00 3071 zsh
2017-11-01T15:47:48+00:00 9380 sleep 123
2017-11-01T15:47:48+00:00 9381 sleep 234
' <(cut -c1-24 | date -f- --iso-8601=s) \
<(cut -c25- < /dev/stdin) | sort
} <<< "$(ps -A -o lstart= -o pid= -o args=)"
)
' <(cut -c1-24 < $1 | date -f- --iso-8601=s) \
<(cut -c25- < $1) | sort
} =(ps -A -o lstart= -o pid= -o args=)
)
Ou com bash
(ou zsh
) apenas no Linux e com o GNU date
:
Wed Nov 1 12:36:15 2017
Tenha também em atenção que a hora de início do processo não é necessariamente a mesma que a última vez que o processo executou um comando, pois os processos geralmente executam mais do que um comando durante a sua vida (aqueles que não são geralmente aqueles que nunca executam um comando). Em outras palavras, não corresponde necessariamente ao tempo em que o comando ( args
field, o equivalente padrão de cmd
) foi iniciado.
Wed 1 Nov 12:36:15 2017
Veja como sleep 123
é visto como iniciado ao mesmo tempo que sleep 234
, embora tenha sido iniciado 4 segundos depois. Isso porque o processo 9388 estava executando inicialmente sh
(e aguardando 4 segundos por sleep 4
) antes de executar sleep 123
(e antes disso, estava executando zsh
code como foi bifurcado pelo meu shell interativo, portanto diferentes pontos no tempo, para esse processo, você teria visto em ps
output: zsh
, então sh
, então sleep
).