подпроцесс. открыть и ipython - PullRequest
       10

подпроцесс. открыть и ipython

0 голосов
/ 14 октября 2018

(Работа с python3.4 в Ubuntu 16.04)

Я пытаюсь понять, является ли мое поведение функцией или чем-то еще.

Я запускаю ipythonshell, и запуск процесса -

subprocess.Popen("MyProcess")

После этого я хватаю файл -

! tail -f a_log

Затем я нажимаю control + c, чтобы выйти из хвоста.

В результате MyProcess также останавливается.

Я вижу это, когда запущено несколько процессов = все они убиты.

Также пытался перенаправить stdout и stderr в подпроцесс.DEVNULL, но это не помогло.

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Первое, что вам нужно понять, это то, что ctrl + c вызывает сигнал для отправки в группу процессов задачи foregrand.Второе, что вам нужно знать, это то, что в группу процессов входит ваш процесс Python и его открытые подпроцессы.

Например, я воссоздаю ваш эксперимент без iPython, используя 4-строчный скрипт:

import subprocess, os

pipe1 = subprocess.Popen('sleep 500', shell=True)
pipe2 = subprocess.Popen('sleep 500', shell=True)
pipe3 = subprocess.Popen('tail -f /var/log/syslog', shell=True).wait()

Как вы можете видеть, это открывает две трубы для sleep (которые ничего не делают в течение 500 секунд) и одну трубу для tail и следуют /var/log/syslog.

Теперь, когда это работаетЯ собираюсь набрать ps ax -O tpgid в другом терминале и увидеть мои запущенные процессы , включая их идентификатор группы :

24083 24083 S pts/9    00:00:00 python3 foo.py
24084 24083 S pts/9    00:00:00 /bin/sh -c sleep 500
24085 24083 S pts/9    00:00:00 sleep 500
24086 24083 S pts/9    00:00:00 /bin/sh -c sleep 500
24087 24083 S pts/9    00:00:00 sleep 500
24088 24083 S pts/9    00:00:00 /bin/sh -c tail -f /var/log/syslog
24089 24083 S pts/9    00:00:00 tail -f /var/log/syslog

Первый столбец - это идентификатор процесса, второй -ID группы, который важен.

Если я запускаю kill -INT 24083, который отправляет сигнал INT (прерывание) в группу процессов 24083 , все процессы в этой группе получаютподайте сигнал и выйдите соответственно.

Вот что происходит с вами, когда вы нажимаете Ctrl + C.Группа процессов получает сигнал, и ожидается, что каждый процесс завершит работу в соответствии со стандартом POSIX.

0 голосов
/ 21 октября 2018

Я нашел способ сделать это:

import os
def myspawn():
    os.setsid()
    path = os.environ["PATH"] + ":/home/another/path"
    env = {"PATH": path}
    os.execlpe("program.sh", env)

def myFunc():
    pid = os.fork()
    if (pid == 0):
        print("In child")
        myspawn()
    else:
        print("in father")
        return

myFunc()
0 голосов
/ 14 октября 2018

Я считаю, что это то, что делает CTRL C

...