Сценарий Python, встроенный в сценарий оболочки, не завершается, и решение демона не соответствует потребностям

Этот вопрос расширяет / оживляет этот. Актуальность для оживления этой темы обусловлена ​​неспособностью решить ту же проблему с данными ответами.

Скрипт bash выполняет встроенный скрипт python. Что-то вроде

  #!/bin/bash
  ./pyscript.py 

chmod +x pyscript.py разрешение было дано.

Были использованы альтернативные способы запуска скрипта. (python -u pyscript.py или /usr/bin/python pyscript.py)

Как видно из названия, программа на python не завершается.

Я попытался следующие попытки в скрипте Python, чтобы решить эту проблему:

  1. sys.exit (0); % программа ловит правильное исключение
  2. os._exit(1) % не работает и корректное исключение ловится
  3. 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 выполняет какой-то ваш код (который, вероятно, есть), он должен показать вам детали этого.

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