Проблемы с завершением процесса с помощью Python в Solaris - PullRequest
2 голосов
/ 09 июня 2011

У меня есть программа на C ++, которая называется C и предназначена для отключения при получении сигнала SIGINT.Я написал программу на Python P , которая запускает C в качестве подпроцесса.Я хочу, чтобы P остановился C .Я попробовал 3 вещи, и я хотел бы знать, почему некоторые из них не работают.

Попытка # 1:

import subprocess
import signal
import os

p = subprocess.Popen(...)
...
os.killpg(p.pid, signal.SIGINT)

Этот код дает мне ошибку

OSError [Errno 3]: Нет такого процесса`

, хотя p.pid соответствует pid, отображаемому как ps .

Попытка № 2:

import subprocess
import signal
import os

p = subprocess.Popen(...)
...
os.system('kill -SIGINT %u' % p.pid)

Это дает мне ошибку

sh: kill: bad signal`

, хотя kill -SIGINT <pid> работает стерминал.

Попытка # 3:

import subprocess
import signal
import os

p = subprocess.Popen(...)
...
os.system('kill -2 %u' % p.pid)

Это работает.

Мой вопрос: почему не сработали # 1 и # 2?


Редактировать: мое первоначальное предположение заключалось в том, что, поскольку в документации для os.kill() написано New in version 2.7: Windows support, я подумал, что os.kill() (а) впервые доступен в 2.7 и (б) работает в Windows.Прочитав ответы ниже, я запустил os.kill() на Solaris, что я должен был сделать в первую очередь, извините, и он работает в 2.4.Очевидно, что документация означает, что поддержка Windows является новой в 2.7.Opps.

Ответы [ 2 ]

5 голосов
/ 09 июня 2011

Первый сбой, потому что os.killpg убивает процесс группа , идентифицированная его лидером; у вас есть простой процесс, а не группа процессов. Попробуйте os.kill вместо этого. Второй сбой, потому что встроенная оболочка kill понимает символьные сигналы, а внешняя команда в Solaris - нет (тогда как в * BSD и Linux это делает); используйте числовой сигнал (SIGINT равен 2 в Solaris или используйте предопределенные константы сигнала Python из модуля signal). Тем не менее, используйте собственный интерфейс Popen вместо того, что упомянуто кем-то другим; не изобретай велосипед, ты обязан создать несколько углов.

1 голос
/ 09 июня 2011

Объект Popen имеет метод kill(), который можно вызывать, а также метод terminate() и универсальный send_signal() метод.

Я бы воспользовался одним из них, а не пробовал какие-либо из внеплановых вещей, которые вы бы использовали с интерфейсом os.У вас уже есть дескриптор процесса, вы должны его использовать!

...