2016-02-04 3 views
0

один скрипт запускается автоматически, когда моя малина загружается, внутри этого скрипта есть датчик движения, если обнаружен, он запускает подпрограммы camera.py (записывает видео, затем преобразует видео и электронные письма)python kill script.py по имени не PID

В главном скрипте, который запускается при загрузке, есть еще одна инструкция if, если кнопка нажата, то остановите camera.py и все в ней и сделайте что-нибудь еще.

Я не могу убить процесс с помощью PID, потому что он продолжает меняться. Единственный другой вариант - убить camera.py по его имени, но он не работает.

Основной сценарий:

p1 = subprocess.Popen("sudo python /home/pi/camera.py", shell=True) 

это мой camera.py сценарий:

import os 
os.system("raspivid -n -o /home/pi/viseo.h264 -t 10000") 
os.system(.... python script0.py 
os.system(.... python script1.py 

я могу сделать:

os.system("sudo killall raspivid") 

если я попробовать

os.system("sudo killall camera.py") 

это дает мне сообщение: Никакой процессу не найден

это только останавливает запись, но я также хочу, чтобы убить любой другой сценарий в camera.py

Может кто-нибудь помочь, пожалуйста? спасибо

ответ

2

Использование pkill:

$ sudo pkill -f camera.py 
+0

Sweet! намного лучше, чем мой вариант –

+0

Спасибо! Но иногда это может быть опасно, потому что оно использует сопоставление шаблонов. – midihenry

+0

Спасибо !!!!!!! это работает, однако не остановило запись, но убило каждый другой скрипт в camera.py – michal

1

Если вы делаете исполняемый файл camera.py, поместите его на свой $ PATH и сделайте строку 1 скрипта #!/usr/bin/python, а затем выполните функцию camera.py без команды python перед ней, ваша команда "sudo killall camera.py" должна работать.

0

вместо использования:

import os 
os.system("raspivid -n -o /home/pi/viseo.h264 -t 10000") 
os.system(.... python script0.py) 
os.system(.... python script1.py) 

вы должны использовать ту же структуру, как и POPEN, как вы икру этот процесс. Это дает вам доступ к объекту Popen вызовов.

import os 
pvid = subprocess.Popen("raspivid -n -o /home/pi/viseo.h264 -t 10000") 
p1 = subprocess.Popen(.... python script0.py) 
p2 = subprocess.Popen(.... python script1.py) 

Тогда вы можете получить pid всех разных сценариев и убить их через это.

Это должно быть сделано через последовательность выключения. Вы не должны принудительно закрывать приложения, если можете позволить им закрыть себя.

+0

Из 'subprocess' [docs] (http://docs.python.org/library/subprocess):« Этот модуль намеревается заменить несколько более старых модулей и функций: ** os.system ** os.spawn \ * os .popen \ * popen2. \ * commands. \ * " – zondo

Смежные вопросы