#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. Я только что понял, что когда я переписывал вопрос, я случайно удалил информацию о версии. Извините за отсутствие ясности!