我正在使用raspberry-pi开发一个项目,并希望在pi上检测按钮以启动程序(squeezelite https://code.google.com/p/squeezelite/),然后再次按下按钮时使用程序启动时捕获的PID。我认为python子进程模块是一个很好的选择,但是,我遇到了一个我无法解决的问题。
代码:
proc=subprocess.Popen(['squeezelite','-o','sysdefault:CARD=ALSA','-n','test','-m', '01:00:00:00:00:03','-z'])
似乎启动了两个过程:
2886 pts/0 Z+ 0:00 [squeezelite] defunct
2887 ? SLsl 0:00 squeezelite -o sysdefault:CARD=ALSA -n test -m 01 00 00 00 00 03 -z
和proc.pid返回第一个的PID。
如果我调用proc.communicate(),那么第一个进程就会被清理掉,而我只剩下第二个进程,顺便说一下,这就是我想要的进程。但是,我不知道第二个进程的PID(因为proc.pid给了我第一个现在已经消失的)。所以我无法在kill命令中使用PID。
我尝试过使用不同选项的subprocess.Popen的各种组合(例如字符串参数,参数参数,shell = True,shell = False),每个组合都给出了类似的结果。
有人可以协助我让这个工作吗?或者是一个更好的方式来启动一个程序,并在以后的某个时间杀死它?
由于 aussieW
答案 0 :(得分:1)
您正在使用squeezelite的-z
选项,该选项会对进程进行守护。这解释了为什么要创建其他流程。我认为最好的解决方案是使用OS守护进程工具(例如,start-stop-daemon),简化你用Python做的调用。有一个guide about daemonizing squeezelite in Debian squeeze,可以帮助您入门。
您需要启动该过程并将其PID保存在文件中,以便稍后停止。一种方法可能是使用一个带有两个参数的守护进程脚本:启动/停止和按钮的标识符。