ps output com formato de data iso?

6

Gostaria de classificar essa saída em lstart (início do processo):

ps -eo lstart,pid,cmd 

Existe uma maneira de produzir lstart no formato ISO como AAAA-MM-DD HH: MM: SS?

Mas classificar sozinho não resolve. Eu realmente gostaria de ter o formato de data ISO.

    
por guettli 01.11.2017 / 09:50

3 respostas

6

Is there a way to output lstart in ISO format like YYYY-MM-DD HH:MM:SS?

Com awk + date cooperação:

ps -eo lstart,pid,cmd --sort=start_time | awk '{ 
       cmd="date -d\""$1 FS $2 FS $3 FS $4 FS $5"\" +7%Y-%m-%d %H:%M:%S7"; 
       cmd | getline d; close(cmd); $1=$2=$3=$4=$5=""; printf "%s\n",d$0 }'

Abordagem alternativa usando ps etimes keyword (o tempo decorrido desde o início do processo, em segundos):

ps -eo etimes,pid,cmd --sort=etimes | awk '{ 
       cmd="date -d -"$1"seconds +7%Y-%m-%d %H:%M:%S7"; 
       cmd | getline d; close(cmd); $1=""; printf "%s\n",d$0 }' 
  • date -d -"$1"seconds - diferença entre o timestamp atual e elapsed time, fornecerá o valor timestamp do processo
por 01.11.2017 / 10:41
4

Você pode classificar com:

ps -eo lstart,pid,cmd --sort=start_time
    
por 01.11.2017 / 09:59
1

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 ).

    
por 01.11.2017 / 13:48

Tags