LINUX.ORG.RU

Завершение всех процессов созданных через subprocess.Popen после выхода из скрипта

 , , , ,


1

1

Вызываю nmap из одного из роутов flask с помощью subprocess.Popen('nmap -p 1-65535 -T4 -A -v -oX file.xml > /dev/null 2>&1', shell=True, start_new_session=True)
после того как я прибиваю flask из терминала, процесс все еще висит.
В чем может быть проблема? Точнее что нужно сделать что бы все созданные подпроцессы дохли?

★★★

Последнее исправление: noname_user (всего исправлений: 1)

  1. Не прибивать, а посылать sigterm. Написать обработчик сигнала в приложении.

  2. Убрать start_new_session, прибивать всю process group

MadMax
()
Последнее исправление: MadMax (всего исправлений: 1)

Еще можно засунуть всё в сервис и дать systemd поубивать.

t184256 ★★★★★
()

Получить pid процесса который ты запустил, и написать обработчик выхода, в котором будешь убивать этот pid

anonymous
()
Ответ на: комментарий от noname_user

Но тогда ведь я не смогу получать pid процесса запущенного

А это почему бы вдруг?

t184256 ★★★★★
()

В чем может быть проблема? Точнее что нужно сделать что бы все созданные подпроцессы дохли?

Именно в этом.

Варианта два.

  1. написать обработчик сигналов Hup и term, при ловле сигналов убивать запущенный пид.

  2. не рожать сессию. а пид защущенного искать путем сканирования каждого /proc/pid/status, и, если ppid совпадает с pid запускающего, то этот запущенный процесс и есть.

anonymous
()

Убирай start_new_session и убивай так:

kill -KILL -`pgrep python` # дефис перед PID
anonymous
()

В чем может быть проблема?

В том, что ты используешь subprocess, да еще и с shell=True

Точнее что нужно сделать что бы все созданные подпроцессы дохли?

Поищи в поиске python kill subprocess. Тебе нужно будет наговнякать свой костыль для мониторинга всех запущенных пидов.

xpahos ★★★★★
()
Последнее исправление: xpahos (всего исправлений: 1)
Ответ на: комментарий от xpahos

[qoute] В том, что ты используешь subprocess, да еще и с shell=True Что можешь посоветовать в данном случае использовать вместо subproccess?

noname_user ★★★
() автор топика
Ответ на: комментарий от noname_user

Тебе shell зачем? Для редиректа в /dev/null? Передай

stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
MadMax
()
Ответ на: комментарий от Morin

To capture the kill signal

SIGKILL не ловится.

anonymous
()
import subproccess
import atexit

def main():
    ps = subprocess.Popen(["nmap","-p", "1-65535", "-T4", "-A", "-v", "-oX", "file.xml"], stdout=subproccess.DEVNULL, stderr=subproccess.DEVNULL)
    atexit.register(ps.kill)
kukuruku ★★
()
Ответ на: комментарий от kukuruku

Сам себя обманывал, практически все время думал что atexit сторонний модуль...лол

noname_user ★★★
() автор топика
Ответ на: Анонимус неодобряет от anonymous

А при чём здесь SO и jQuery? Если у тебя есть предложение получше, о том как управлять группой процессов (Т.е. создать «на лету» Control group) - вываливай. Условие: это должно быть просто и быстро, потому что автор треда вроде как собирается использовать это лишь во время разработки.

anonymous-angler ★☆
()
Ответ на: комментарий от anonymous-angler

А при чём здесь SO и jQuery?

Прикол такой был, спрашивает чел «Как мне сделать на жаваскрипте такое?», а ему какой-то набивающий себе очки индус вместо нормального кода на жаваскрипте вываливает код с использованием jQuery. jQuery уже вроде как помер с появлением этих их реактов с ангулярами, а индусоответы до сих пор висят.

Если у тебя есть предложение получше, о том как управлять группой процессов (Т.е. создать «на лету» Control group) - вываливай. Условие: это должно быть просто и быстро, потому что автор треда вроде как собирается использовать это лишь во время разработки.

Ты путаешь process group и control group. Предложение убивать по process group было уже в первом коментарии. man setsid, man kill если хочешь утилиты в командной строке.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.