Проблемы с завершением процесса с помощью Python в Solaris

#python #solaris #kill

#python #solaris #убить

Вопрос:

У меня есть программа на 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)
  

Этот код выдает ошибку

Ошибка [Ошибка 3]: такого процесса нет`

даже несмотря на то, что p.pid соответствует pid отображаемому ps.

Попытка # 2:

 import subprocess
import signal
import os

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

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

sh: kill: неверный сигнал`

даже несмотря на то, что 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.

Ответ №1:

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

Комментарии:

1. /usr/bin/kill Внешняя команда в Solaris принимает символьные имена без SIG префикса, поэтому kill -INT должно сработать.

Ответ №2:

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

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

Комментарии:

1. К сожалению, я использую python 2.4, и все эти функции были добавлены только в python 2.6.

2. Я только что понял, что когда я переписывал вопрос, я случайно удалил информацию о версии. Извините за отсутствие ясности!