Запуск модулей в качестве подпроцессов в фоновом режиме и отсоединение
В 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 делает.