2014-09-23 6 views
0

У меня есть скрипт bash, работающий на Ubuntu. Можно ли увидеть, что строка/команда выполняется без перезапуска скрипта.Howto debug running bash script

Проблема в том, что сценарий иногда не выходит. Это очень сложно воспроизвести (теперь я его поймал), поэтому я не могу просто остановить скрипт и начать отладку.

Любая помощь будет очень ценна

P.S. Сценарий логики трудно понять, поэтому я не могу понять, почему он заморожен силой мыслей.

+0

Ответ на этот вопрос: [Bash scripting, проверка ошибок, протоколирование] (http://stackoverflow.com/questions/2362255/bash-scripting-checking-for-errors-logging) Вы можете использовать "> > ", чтобы вставлять команды, которые вносят записи в файл error_log. –

+2

Обычный способ отладки сценария оболочки - добавить 'set -x' в начало, но для этого потребуется перезапустить его. Единственное предложение, о котором я могу думать, это использовать «strace», но я не знаю, как легко будет преобразовать его вывод в строки сценария. – Barmar

+2

@FranzHolzinger Как он сделает это без перезапуска скрипта? – Barmar

ответ

1

Попробуйте найти идентификатор процесса (pid) оболочки, вы можете использовать ps -ef | grep <script_name> . Давайте установим этот pid в переменной оболочки $PID. Найти все дочерние процессы этого $PID по:

ps --ppid $PID 

Вы могли бы найти один или более (если, например, он застрял в конвейерной серии команд). Повторите эту команду пару раз. Если это не изменится, это означает, что скрипт застрял в определенной команде. В этом случае, вы можете прикрепить команду трассировки запущенного дочернего процесса:

sudo strace -p $PID 

Это покажет вам, что выполняется, либо бесконечный цикл (например, чтение из трубы) или ожидание какого-либо события, которое никогда не бывает.

В случае, если вы найдете ps --ppid $PID изменений, это означает, что ваш скрипт продвигается, но он застрял где-то, например. локальный цикл в скрипте. Из изменяющихся команд он может дать вам подсказку, где в скрипте он зацикливается.

+0

Ну, ваш подход дал мне хоть что-то. 'code' sudo strace -p $ PID' code' производит 'code' read (3,' code'. Digit - это дескриптор файла, используя lsof, я обнаружил, что это unix-сокет. Итак, сценарий вызывает некоторую работу системы и ждет ответа от него с помощью этого сокета. К сожалению, этого недостаточно. – long

+0

1- Что такое команда, за которой застрял этот скрипт? 2- Не могли бы вы поделиться выходом 'cat/proc/$ {PID}/fdinfo/3' –

+0

К сожалению, ошибка действительно редка ... Я пытаюсь запустить команду в следующий раз, когда она воспроизводит – long