LINUX.ORG.RU

Как остановить процесс

 


0

2

Уважаемые форумчане. Уже замучался. Имеется программа, в которой запускается дочерний поток, а в нем процесс:

class MyThread(QtCore.QThread):
    def __init__(self, full_dir, parent=None):
        QtCore.QThread.__init__(self, parent)
    def run(self):
        file = open("/home/kalina/OpenFOAM/out.log", "a")
        proc = subprocess.Popen(["bash /*/*/OpenFOAM/QW"], 
        cwd = full_dir, shell = True, stdout=file, stderr=file)

Запускаю поток командой .start(). Все нормально работает При попытке завершить процесс командой

proc.kill()
ничего не происходит. Сабпроцесс так дальше и выполняется. Как поток остановить вообще непонятно

тебе может имеет смысл студенту какому-нибудь заказать то, что ты там делать пытаешься? к чему все эти мучения?

Novel ★★★★
()

Здесь несколько проблем:

1) Писать команду для сабпроцесса, согласно ману, надо либо строкой, либо списком из отдельных строк-аргументов.

2) Останавливать процесс лучше не proc.kill(), а proc.terminate(). Остановка процесса может занять некоторое время, для ожидания специально придумали proc.wait().

3) Вообще говоря, поток остановить нельзя. Есть рецепты, как его остановить, но это не всегда работает и привносит много проблем. Рекомендуемый способ: прокинуть пайп или очередь, передать сообщение об остановке (хотя бы None) и вручную остановить поток.

Алсо, полезно почитать логи того, что запускается в сабпроцессе.

Читайте маны и гугл.

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

Самое интересное, что процесс вроде как завершается, то есть появляется сообщение, что процесса с таким pid не существует. Но тогда почему расчеты, производимые в этом процессе продолжают производиться??((

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

Скорее всего процесс самого баша прибивается, но из башевого скрипта вызывается еще одна программа (очевидно, со своим процессом). Как вариант - модифицируй скрипт и сохраняй в какой-то файл pid процесса, который считает, потом прибивай по этому pid'у. Или откажись от баш-скриптов и всё в питон. Возможно, есть более элегантный метод.

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

Да, и еще. Рекомендуется по возможности НЕ использовать shell=True (это дыра по безопасности), а пользоваться питоновскими средствами по генерации списка файлов. Можешь посмотреть в сторону модуля glob.

lu4nik ★★★
()

Тут основные ошибки уже сказали. Добавлю что модуль shlex отлично решает проблему разбивания строки на отдельные аргументы, так что shell=True не нужен:

import shlex
proc = subprocess.Popen(shlex.split(CMD))

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