Сценарий Python, встроенный в сценарий оболочки, не завершается, и решение демона не соответствует потребностям
Этот вопрос расширяет / оживляет этот. Актуальность для оживления этой темы обусловлена неспособностью решить ту же проблему с данными ответами.
Скрипт bash выполняет встроенный скрипт python. Что-то вроде
#!/bin/bash
./pyscript.py
chmod +x pyscript.py
разрешение было дано.
Были использованы альтернативные способы запуска скрипта. (python -u pyscript.py или /usr/bin/python pyscript.py)
Как видно из названия, программа на python не завершается.
Я попытался следующие попытки в скрипте Python, чтобы решить эту проблему:
- sys.exit (0); % программа ловит правильное исключение
- os._exit(1) % не работает и корректное исключение ловится
- sys.stdout.flush() % для очистки буфера стандартного вывода
Демонстрационное решение не подходит для того, что мне нужно, потому что запуск в фоновом режиме независимо от основного скрипта не будет ждать выполнения программы на Python до конца.
Какие альтернативные решения остаются для этого случая?
4 ответа
В конечном итоге проблема решена.
Программа на python, которую я пытался убить, работает с несколькими потоками. sys.exit(0)
только завершает поток, в котором вызывается программа.
os._exit(1)
был вызван с sys.exit(0)
до его исполнения (провал!).
Запустив os._exit(1)
без sys.exit(0)
раньше программа выходила из скрипта python.
Причина должна быть в том, что sys.exit()
только завершает поток, в котором он вызывается, и позволяет программе очищать ресурсы, тогда как os._exit() выполняет внезапное завершение программы. Нашел здесь.
С этим решением лучше гарантировать завершение любой задачи, которую программа должна завершить, а затем вызвать os._exit
,
Вы пытались использовать strace -p $PID
на процесс Python? Вывод не всегда будет полезен как бы то ни было.
С точки зрения кода, в дополнение к потокам я бы проверил, есть ли какие-либо обработчики сигналов (которые, возможно, не прерываются по какой-то причине).
Что касается темы, вы можете быть заинтересованы в этом, хотя я думаю, что кто-то упомянул об этом в другой теме.
Что я обычно делаю, чтобы отделить скрипт от основного процесса терминала, - это отослать скрипт внутри отсоединенного сеанса экрана. Тогда я без проблем убью pid скрипта. Но для этого конкретного случая я хочу, чтобы программа ожидала конца индекса Python, а не как параллельный процесс.
Кроме того, вы можете попробовать модуль трассировки, т.е. запустить вашу программу с #!/usr/bin/env python -m trace --trace
, Если python выполняет какой-то ваш код (который, вероятно, есть), он должен показать вам детали этого.