Comando com o qual um processo foi executado

8

Suponha que eu executei o processo com o seguinte comando:

myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1

Depois de um tempo eu só tenho pidde myappprocesso, por exemplo 1234. Existe uma maneira de obter o comando com todas as bandeiras e saída redirecionando para myapp.logde alguma forma, por pid?

user3663882
fonte

Respostas:

10
ps -o args= -p "$pid"

Dirá a você a lista de argumentos dada ao último comando que o processo executou (ou, se não executou nenhum, aquele que seu pai executou ...), desde que o processo não substitua sua lista de argumentos posteriormente.

psmostrará que a lista arg concatenou com espaços e até um limite que você pode aumentar com algumas psimplementações adicionando algumas -wopções). No Linux, você pode ver o arglist separado por NUL bytes em /proc/$pid/cmdline.

lsof +fg -ap "$pid" -d 0-2

Dirá a você o que os descritores de arquivo stdin, stdout e stderr do processo apontam e o modo como eles foram abertos (como W,APsomente para gravação com acréscimo, como se um >>redirecionamento fosse usado em um shell POSIX).

Stéphane Chazelas
fonte
1 para a utilização lsofpara detectar que o processo está a redireccionar paramyapp.log
joeytwiddle
1
Outra maneira de encontrar o arquivo de saída é:readlink /proc/$pid/fd/1
joeytwiddle 28/09
Aaah, eu pensei que o OP significava sinalizadores de processo, não uma impressão do comando e suas opções! Boa resposta.
Arronical
4

Você pode usar o pscomando e especificar o pid para examinar com a -popção, usando a -fopção para fornecer uma lista completa ou -luma lista longa mais detalhada.

Como um exemplo para a saída:

$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0 31441 31319  0  80   0 -  1423 hrtime pts/3    00:00:00 sleep
$ ps -fp 31441
UID        PID  PPID  C STIME TTY          TIME CMD
root     31441 31319  0 10:44 pts/3    00:00:00 sleep 60

No entanto, isso gera uma linha de cabeçalho, que você pode não querer no seu arquivo de log. Você pode apará-lo usando a -hopção, se seu pid for 1234:

ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1

Observe que redirecionei a saída usando >>para anexar ao seu arquivo de log.

Arronical
fonte
Para eliminar a linha do cabeçalho tail -n+1(requer GNU, mas Q era Linux / Ubuntu). Ou evite o problema com ps -h{f,l}p 1234(também GNU).
Dave_thompson_085
@ dave_thompson_085 obrigado, eu sabia que havia uma opção para remover o cabeçalho, mas não rolava o suficiente pela página de manual. tail -n1definitivamente funciona no Ubuntu, por que é +necessário?
Arronical 28/09
Acho que Dave quis sugerir o tail -n+2que mostra todas as linhas, exceto a primeira.tail -n1mostra apenas a última linha. Compare: seq 1 10 | tail -n+2e assim por diante.
Joeytwiddle 28/09/16
1
@joeytwiddle ah agora eu vejo, eu editei para incluir seus conselhos para usar -h , pois evita um tubo desnecessário e um processo extra.
Arronical
1

Usando ps -fvocê pode verificar a lista de argumentos e também pode redirecioná-la para qualquer arquivo.

Então, neste caso, basta usar ps -ef | grep 1234 > myapp.log

Por favor, verifique esta página de manual do ps .

Harshit
fonte
1
Isso também não produzirá os detalhes do comando grep?
Arronical
2
@ Arronical Sim, você está certo. Você pode evitar isso excluindo o comando grep:ps -ef | grep 'foo' | grep -v grep
maulinglawns
@ maulinglawns é o que eu teria feito se seguisse a rota grep, também tem o benefício de remover o cabeçalho.
Arronical
Para evitar o grep -vuso que este truque:grep '123[4]'
joeytwiddle