Obtém o tempo decorrido do processo em segundos

1

Semelhante a Como verificar quanto tempo um processo foi executado? , estou tentando obter o tempo decorrido para um processo em segundos em um sistema Linux embarcado usando BusyBox e sh (não bash ). A diferença é que eu gostaria em segundos, não no formato mm: ss.

Eu posso analisá-lo do resultado de ps , mas não consigo obter expr para converter de mm: ss para segundos. Usando set -vx para ajudar na depuração, posso ver o comando expr válido, mas ele falha com um erro de sintaxe. Copiar e colar funciona bem.

Depois de executar isso para diagnósticos adicionados:

root@embedded:~# set -vx

Eu entro:

root@embedded:~# $(/opt/bin/busybox ps -o pid,etime,time | grep 1156 | sed "s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr  \\* 60 + /")

E receba esta resposta:

$(/opt/bin/busybox ps -o pid,etime,time | grep 1156 | sed "s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr  \\* 60 + /")
+ /opt/bin/busybox ps -o pid,etime,time
+ grep 1156
+ sed s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr  \* 60 + /
+ /opt/bin/busybox expr 2 \* 60 + 03
expr: syntax error
root@embedded:~#

Eu também tentei várias camadas de \ escapes e também '' .

O que preciso fazer para que o escape do * passe para a linha de comando expr ?

    
por altendky 08.06.2015 / 14:10

4 respostas

5

eval pode ajudar neste caso ...

~ $ $(echo expr 1 \* 2)
+ echo expr 1 \* 2
+ expr 1 \* 2
expr: syntax error
~ $ eval $(echo expr 1 \* 2)
+ echo expr 1 \* 2
+ eval expr 1 \* 2
+ expr 1 * 2
2

Mas talvez seja melhor procurar /proc/$pid/stat no Linux.

pid=1155
hz=$(getconf CLK_TCK)
uptime=$(awk '{print $1}' < /proc/uptime)
starttime=$(awk '{print $22}' < /proc/$pid/stat)
echo $(( ${uptime%.*} - $starttime / $hz ))

Se /usr/bin/getconf estiver indisponível, você precisará encontrar o valor CLK_TCK (ou USER_HZ ) do seu sistema. Eu acho que você pode assumir isso como 100 na maioria dos casos.

    
por 08.06.2015 / 15:22
1

Embaraçosamente, parece que não consegui testar tão completamente quanto pensava. Acontece que modificar o que eu postei na minha pergunta para conter apenas dois escapes ( \* ) faz com que funcione bem.

root@embedded:~# $(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr  \* 60 + /p")
$(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr  \* 60 + /p")
+ /opt/bin/busybox ps -o pid,etime
+ sed -n s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr  \* 60 + /p
+ expr 293 * 60 + 54
17634

Observe que também integrei a abordagem grep into sed com a abordagem -n 's///p' (oprint global n e, em seguida, p na correspondência).

Obrigado a @yaegashi por me fazer experimentar \ novamente ...

    
por 08.06.2015 / 19:11
1

O processo assumping é 16752 (que você parece ser capaz de descobrir)

expr $(date +%s) - $(stat -c %Y /proc/16752/environ )

onde

  • date +%s é a data atual em segundo desde a época
  • stat -c %Y /proc/16752/environ é "data de criação" de / proc / 16752 / environ, que é o momento em que o proc # 16752 foi lançado

editar:

  • talvez /proc/$PID/environ seja o pseudo arquivo incorreto, /proc/$PID/exe deve ser usado em seu lugar.

  • se o tempo for alterado no host, ambos resultarão de ps -p $PID -h -o etime e o registro de data e hora de /proc/$PID/exe provavelmente estará errado. (não tem certeza de como verificar isso).

por 08.06.2015 / 16:11
0

@yaegashi teve a abordagem certa, mas minha chamada sed parece introduzir a necessidade de um terceiro \ .

root@embedded:/data# set -vx
root@embedded:/data# echo Process Uptime: $(eval $(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *${APP_PID} \+\([0-9]\+\):\([0-9]\+\).*/expr  \\* 60 + /p"))
echo Process Uptime: $(eval $(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *${APP_PID} \+\([0-9]\+\):\([0-9]\+\).*/expr  \\* 60 + /p"))
+ /opt/bin/busybox ps -o pid,etime
+ sed -n s/ *1156 \+\([0-9]\+\):\([0-9]\+\).*/expr  \* 60 + /p
+ eval expr 2 \* 60 + 46
+ expr 2 * 60 + 46
+ echo Process Uptime: 166
Process Uptime: 166

Dedos cruzados que isso não só funciona agora, mas também continua a fazê-lo na próxima vez que eu usá-lo ...

    
por 08.06.2015 / 20:17

Tags