Запуск модулей в качестве подпроцессов в фоновом режиме и отсоединение - python


1

В 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 работать в фоновом режиме до завершения
  •  4
  •  3
  • 8 фев 2020 2020-02-08 08:06:00

3 ответа

0

Вероятно, это дубликат Запустите программу с python и продолжайте ее запускать после того, как script будет убит, и нет, игнорирование SIGHUP не поможет, но preexec_fn = os.setpgrp делает.

  • 8 фев 2020 2020-02-08 08:06:01
0

Я не знаю о каком-либо механизме для него в python, но вы можете попробовать использовать nohup. Вы можете попробовать запустить

nohup python your_script.py arguments

Использование os.system или subprocess.call.

  • 8 фев 2020 2020-02-08 08:06:01
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.

  • 8 фев 2020 2020-02-08 08:06:01