Запуск модулей в качестве подпроцессов в фоновом режиме и отсоединение
В bash я могу сделать следующее:
for f in subdir/*.sh; do
nohup "$f" "[email protected]" &> /dev/null &
done
Другими словами, он запускает все
*.sh скрипты в
subdir в фоновом режиме и отделяется, так что если главный script заканчивается, фоновые сценарии не будут завершены.
Теперь скажем, у меня есть следующий проект Python:
proj/
__init__.py
main.py
subdir/
__init__.py
mod_a.py
mod_b.py
mod_c.py
Как мне сделать что-то похожее на bash script? Но с параметрами, переданными как объекты Python?
Например: у меня есть две строки a и b, список l и словарь d
- Загрузите
mod_a.py, вызовите mod_a.main(a, b, l, d) и отсоедините
- Загрузите
mod_b.py, вызовите mod_b.main(a, b, l, d) и отсоедините
- Загрузите
mod_c.py, вызовите mod_c.main(a, b, l, d) и отсоедините
-
main.py может завершаться, позволяя mod_a, mod_b и mod_c работать в фоновом режиме до завершения
Ответы
Ответ 1
Чтобы эмулировать nohup в Python, вы можете заставить дочерние процессы игнорировать сигнал SIGHUP:
import signal
def ignore_sighup():
signal.signal(signal.SIGHUP, signal.SIG_IGN)
i.e., чтобы эмулировать bash script:
#!/bin/bash
for f in subdir/*.sh; do
nohup "$f" "[email protected]" &> /dev/null &
done
с использованием модуля subprocess в Python:
#!/usr/bin/env python3
import sys
from glob import glob
from subprocess import Popen, DEVNULL, STDOUT
for path in glob('subdir/*.sh'):
Popen([path] + sys.argv[1:],
stdout=DEVNULL, stderr=STDOUT, preexec_fn=ignore_sighup)
Чтобы создать подходящих демонов, вы можете использовать python-daemon package.
Ответ 2
Я не знаю о каком-либо механизме для него в python, но вы можете попробовать использовать nohup. Вы можете попробовать запустить
nohup python your_script.py arguments
Использование os.system или subprocess.call.
Ответ 3
Вероятно, это дубликат Запустите программу с python и продолжайте ее запускать после того, как script будет убит, и нет, игнорирование SIGHUP не поможет, но preexec_fn = os.setpgrp делает.