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
.
gdb
:print (char *)rl_line_buffer
. O comando atual em uma sequência éprint (char *)the_printed_command
. Você também podecall history_builtin()
, mas isso resultará no tty do processo do bash, por isso pode ser menos útil.Como o comando ainda está sendo executado na tela, seu bash pai não releu nenhum histórico, portanto:
^Z
entãoup arrow
^A^A
- porque tela (1) - e^E
) e eco + redirecione para um arquivofg
para perseguir a execução de comandosExistem advertências, mas isso é útil o suficiente, na maioria das vezes.
fonte
up
. Embora você deva ter certeza de que o reinício será iniciado sem problemas, mas se não acontecer, você terá o mesmo problema após uma reinicialização. Você só precisa escolher o momento em que um tempo de inatividade não seria um problema.Eu sei que você encontrou sua própria resposta, mas há uma razão para você não poder fazer algo assim:
Talvez você não consiga combinar a saída do trabalho real e a saída do bash mostrando a linha atualmente em execução.
Além disso, FWIW, se você preferir verbosidade
set -o xtrace
,.fonte