У меня есть долго работающий bash
экземпляр (внутри screen
сеанса), который выполняет сложный набор команд внутри цикла (каждый цикл выполняет конвейеры, перенаправления и т. Д.).
Длинная командная строка была написана внутри терминала - она не внутри скрипта. Теперь я знаю идентификатор процесса bash, и у меня есть root-доступ - как я могу увидеть точную командную строку, выполняемую внутри этого bash
?
bash$ echo $$
1234
bash$ while true ; do \
someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done
И в другом экземпляре оболочки я хочу видеть командную строку, выполняемую внутри 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'
Это возможно?
РЕДАКТИРОВАТЬ # 1
Добавление контрпримеров для некоторых ответов, которые я получил.
Об использовании
cmdline
under/proc/PID
: это не работает, по крайней мере, в моем сценарии. Вот простой пример:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
В другой оболочке:
$ cat /proc/8909/cmdline bash
Использование
ps -p PID --noheaders -o cmd
так же бесполезно:$ ps -p 8909 --no-headers -o cmd bash
ps -eaf
Также не полезно:$ 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
То есть нет выхода ОРИГИНАЛА командной строки, которая является то , что я ищу - то есть
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.
gdb
:print (char *)rl_line_buffer
. Текущая команда в последовательностиprint (char *)the_printed_command
. Вы также можетеcall history_builtin()
, но это будет выводить tty процесса bash, так что это может быть менее полезным.Поскольку команда все еще выполняется на экране, ее родительский bash не перечитал историю, поэтому:
^Z
тогдаup arrow
^A^A
- потому что screen (1) - и^E
) и echo + перенаправление в файлfg
продолжать выполнение командыЕсть предостережения, но в большинстве случаев это достаточно полезно.
источник
up
. Хотя вы должны быть уверены, что он запустится снова без проблем, но если этого не произойдет, у вас все равно будет такая же проблема после перезагрузки. Вам просто нужно выбрать момент, когда простоя не будет проблемой.Я знаю, что вы нашли свой собственный ответ, но есть ли причина, по которой вы не можете сделать что-то вроде этого:
Возможно, вы не можете смешать вывод фактического задания и вывод bash, показывая текущую выполняемую строку.
Кроме того , FWIW, если вы предпочитаете многословие,
set -o xtrace
.источник