J'ai une bash
instance longue (à l'intérieur d'une screen
session) qui exécute un ensemble complexe de commandes à l'intérieur d'une boucle (chaque boucle faisant des tuyaux, des redirections, etc.).
La longue ligne de commande a été écrite à l'intérieur du terminal - elle ne se trouve dans aucun script. Maintenant, je connais l'ID du processus bash et j'ai un accès root - comment puis-je voir la ligne de commande exacte en cours d'exécution à l'intérieur de cela bash
?
bash$ echo $$
1234
bash$ while true ; do \
someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done
Et dans une autre instance de shell, je veux voir la ligne de commande exécutée dans le 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'
Est-ce possible?
EDIT # 1
Ajout de contre-exemples pour certaines réponses que j'ai.
À propos de l'utilisation du
cmdline
sous/proc/PID
: cela ne fonctionne pas, du moins pas dans mon scénario. Voici un exemple simple:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Dans un autre shell:
$ cat /proc/8909/cmdline bash
L'utilisation
ps -p PID --noheaders -o cmd
est tout aussi inutile:$ ps -p 8909 --no-headers -o cmd bash
ps -eaf
n'est pas non plus utile:$ 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
Autrement dit, il n'y a pas de sortie de la ligne de commande ORIGINALE, ce que je recherche - c'est-à-dire le
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.
gdb
:print (char *)rl_line_buffer
. La commande actuelle dans une séquence estprint (char *)the_printed_command
. Vous pouvez aussicall history_builtin()
, mais cela sortira sur le tty du processus bash, donc cela pourrait être moins utile.Puisque la commande est toujours en cours d'exécution à l'écran, son parent bash n'a relu aucun historique donc:
^Z
ensuiteup arrow
^A^A
- parce que l'écran (1) - et^E
) et la redirection echo + dans un fichierfg
poursuivre l'exécution du commandementIl y a des mises en garde, mais c'est assez utile, la plupart du temps.
la source
up
. Bien que vous deviez être sûr qu'il redémarrera sans aucun problème, mais si ce n'est pas le cas, vous aurez quand même le même problème après un redémarrage. Vous n'avez qu'à choisir votre moment où un temps d'arrêt ne serait pas un problème.Je sais que vous avez trouvé votre propre réponse, mais y a-t-il une raison pour laquelle vous ne pouvez pas faire quelque chose comme ça:
Peut-être que vous ne pouvez pas mélanger la sortie du travail réel et la sortie de bash montrant la ligne en cours d'exécution.
, FWIW, si vous préférez également verbosité,
set -o xtrace
.la source