Eu tenho uma bash
instância de execução longa (dentro de uma screen
sessão) que está executando um conjunto complexo de comandos dentro de um loop (com cada loop executando pipes, redirecionamentos etc.).
A longa linha de comando foi escrita dentro do terminal - não está em nenhum script. Agora, eu sei o ID do processo bash e tenho acesso root - como posso ver a linha de comando exata sendo executada dentro dele bash
?
bash$ echo $$
1234
bash$ while true ; do \
someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done
E em outra instância do shell, quero ver a linha de comando executada dentro do PID 1234:
bash$ echo $$
5678
bash$ su -
sh# cd /proc/1234
sh# # Do something here that will display the string \
'while true ; do someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done'
Isso é possível?
EDIT # 1
Adicionando contra-exemplos para algumas respostas que tenho.
Sobre o uso do
cmdline
under/proc/PID
: isso não funciona, pelo menos não no meu cenário. Aqui está um exemplo simples:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Em outra concha:
$ cat /proc/8909/cmdline bash
Usar
ps -p PID --noheaders -o cmd
é tão inútil:$ ps -p 8909 --no-headers -o cmd bash
ps -eaf
também não é útil:$ ps -eaf | grep 8909 ttsiod 8909 8905 0 10:09 pts/0 00:00:00 bash ttsiod 30697 8909 0 10:22 pts/0 00:00:00 sleep 30 ttsiod 31292 13928 0 10:23 pts/12 00:00:00 grep --color=auto 8909
Ou seja, não há saída da linha de comando ORIGINAL, que é o que estou procurando - ou seja, o
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.