SSH, выполненный из Perl, мгновенно получает SIGSTOP

У меня есть некоторый Perl-скрипт, который выполняет некоторые команды на удаленном сервере Gerrit через SSH. Он работает на виртуальной машине Debian Lenny. В течение нескольких месяцев это было выполнено следующим образом:

./script.pl &>~/script.log &
disown

и все работало хорошо. Однако с прошлой пятницы этот скрипт и его дочерние процессы ("sh -c ssh ...." и "ssh ...") зависают в какой-то момент именно во время выполнения удаленной команды. "ps x" показывает состояние T (sTopped) для всех из них. Отправка SIGCONT не очень помогает. Они получают SIGSTOP сразу после него.

Я не вижу такого проводного поведения при интерактивном запуске этого скрипта (теперь он работает на экране без проблем).

Я пытался использовать strace, чтобы выяснить, что происходит, но я не могу уловить эту ошибку, поскольку эти сценарии хорошо работают при интерактивном запуске. Я не знаю, кто может отправить SIGSTOP, и я не знаю, какой процесс сначала получает этот сигнал. Могу ли я узнать эту информацию как-нибудь? Как можно исследовать такую ​​проблему?

PS Моя сфера ответственности ограничена мониторингом и перезапуском (при необходимости) этого скрипта. Я не знаю, какие изменения были внесены ответственными людьми на этом сервере или на удаленном сервере Gerrit.

1 ответ

Решение

После дополнительных экспериментов со strace (спасибо за комментарий womble) я обнаружил, что мой процесс ssh получает SIGTTIN, и это вызывает проблему, с которой я столкнулся. Первая ссылка от Google для "ssh SIGTTIN" проясняет ситуацию: http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch07_04.htm раздел "7.4.5.6. Фоновый рисунок удаленной команды":

ssh предоставляет параметр командной строки -n, чтобы обойти эту проблему. Он перенаправляет стандартный ввод из / dev / null, что предотвращает блокировку ssh для ввода.

Другие вопросы по тегам