Запустится 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

О, парень, это скорее всего тупиковая ошибка...