Python внутри GNU Screen в конечном итоге становится бездействующим, если Screen отключен
У меня есть скрипт Python, который использует многопроцессорную обработку и подпроцесс для запуска нескольких внешних команд параллельно с различными аргументами. Код можно найти здесь.
Для удобства я запускаю этот скрипт в сеансе GNU Screen. Машина, на которой выполняется этот скрипт, имеет 12 процессоров, которые простаивают до тех пор, пока процессы не станут активными.
Каждый из этих процессов занимает от нескольких часов до нескольких дней, поэтому я часто отключаюсь от компьютера и отключаю сеанс экрана.
Однако недавно я заметил поведение, которого никогда не испытывал раньше. Несколько раз я возвращался к машине, чтобы обнаружить, что она простаивает с нулевой нагрузкой. Если я получаю список активных процессов либо через ps ux
или же top
Я все еще могу найти сценарий (и подпроцессы) в списке процессов. Затем я снова присоединяю сеанс экрана, чтобы проверить состояние программы, и сразу же новая очередь процессов отправляется в очередь, и загрузка системы возвращается к 12 за считанные секунды. Обратите внимание, что я абсолютно ничего не сделал со сценарием, кроме повторного подключения сеанса экрана.
Я установил инструмент мониторинга в системе, и в результате некоторые процессы завершаются через определенное время, и новые процессы не запускаются. Таким образом, система активна до тех пор, пока подпроцессы не будут заняты, и станет бездействующим, как только в очереди больше не будет освобождено заданий.
Итак, мой вопрос: кто-нибудь знает какие-либо причины, которые объясняют это поведение?
РЕДАКТИРОВАТЬ: Через год или около того, эта проблема больше не воспроизводится, ни какой-либо патч на экране или самого Python. Я принимаю ответ, поскольку он дал хорошие указания для тестирования.
1 ответ
Я не могу объяснить причину того, что вы видите. Тем не менее, у меня есть идея, что вы можете попробовать дальше.
- Попробуйте передать вывод скрипта по адресу: | tee out.txt Если это не имеет никакого эффекта, попробуйте...
- Запустите экран на другом хосте. Оттуда SSH в ваш рабочий хост. Запустите ваш скрипт в неэмулированной оболочке. Тогда не стесняйтесь отключиться и снова подключиться с вашего прыжка, чтобы проверить процесс. Это должно скрыть от работника, что экран в любом случае вовлечен.
Пожалуйста, прокомментируйте результаты этих тестов. Это даст мне больше для продолжения.