Запустится bash script. Могу ли я узнать, в какой строке он включен?
например. поддерживает ли поддержка bash отладчик к существующим процессам и проверяет текущее состояние?
Или я могу легко узнать, посмотрев записи процесса bash в /proc? Есть ли удобный инструмент для указания номеров строк в активных файлах?
Я не хочу убивать и перезапускать процесс.
Это на Linux - Ubuntu 10.04.
Ответы
Ответ 1
Недавно я оказался в подобном положении. У меня была оболочка script, которая не была идентифицирована с помощью других средств (таких как аргументы и т.д.).
Есть способы узнать намного больше о текущем процессе, чем вы ожидали.
Используйте lsof -p $pid
, чтобы увидеть, какие файлы открыты, что может дать вам некоторые подсказки. Обратите внимание, что некоторые файлы, "удаленные", все еще могут оставаться открытыми с помощью script. Пока script не закрывает файл, он все равно может читать и писать из него - и файл по-прежнему занимает место в файловой системе.
Используйте strace
, чтобы активно отслеживать системные вызовы, используемые script. script будет читать файл script, поэтому вы можете увидеть некоторые из команд, пока они будут прочитаны до выполнения. Найдите команды read
с помощью этой команды:
strace -p $pid -s 1024
Это приводит к тому, что команды печатают строки длиной до 1024 символов (обычно команда strace
будет усекать строки намного короче, чем это).
Изучите каталог /proc/$pid
, чтобы узнать подробности о script; в частности, см. /proc/$pid/environ
, который даст вам среду процесса, разделенную нулями. Чтобы правильно прочитать этот "файл", используйте следующую команду:
xargs -0 -i{} < /proc/$pid/environ
Вы можете передать это в less
или сохранить в файле. Существует также /proc/$pid/cmdline
, но возможно, что это даст только имя оболочки (-bash
например).
Ответ 2
Нет реального решения. Но в большинстве случаев script ожидает завершения дочернего процесса:
ps --ppid $(pidof yourscript)
Вы также можете настроить обработчики сигналов в своей оболочке, чтобы переключить печать команд:
#!/bin/bash
trap "set -x" SIGUSR1
trap "set +x" SIGUSR2
while true; do
sleep 1
done
Затем используйте
kill -USR1 $(pidof yourscript)
kill -USR2 $(pidof yourscript)
Ответ 3
Используйте pstree
чтобы показать, какую команду/исполняемый файл linux вызывает ваш скрипт. Например, 21156
- это pid моего скрипта:
ocfs2cts1:~ # pstree -pl 21156
activate_discon(21156)───mpirun(15146)─┬─fillup_contig_b(15149)───sudo(15231)───chmod(15232)
├─ssh(15148)
└─{mpirun}(15147)
Так что, я знаю, это висит в команде chmod
. Затем покажите трассировку стека:
ocfs2cts1:~ # cat /proc/15232/stack
[<ffffffffa05377ef>] __ocfs2_cluster_lock.isra.39+0x1bf/0x620 [ocfs2]
[<ffffffffa053856d>] ocfs2_inode_lock_full_nested+0x12d/0x840 [ocfs2]
[<ffffffffa0538dbb>] ocfs2_inode_lock_atime+0xcb/0x170 [ocfs2]
[<ffffffffa0531e61>] ocfs2_readdir+0x41/0x1b0 [ocfs2]
[<ffffffff8120d03c>] iterate_dir+0x9c/0x110
[<ffffffff8120d453>] SyS_getdents+0x83/0xf0
[<ffffffff815e126e>] entry_SYSCALL_64_fastpath+0x12/0x6d
[<ffffffffffffffff>] 0xffffffffffffffff
О, парень, это скорее всего тупиковая ошибка...