2

我正在使用 raspberry-pi 开展一个项目,并希望检测到按下 pi 上的按钮以启动程序(squeezelite https://code.google.com/p/squeezelite/),然后在按下按钮时再次使用程序启动时捕获的 PID 杀死程序。我认为 python subprocess 模块是一个不错的选择,但是,我遇到了一个我无法解决的问题。

编码:

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),每个组合都给出了相似的结果。

任何人都可以帮助我让它工作吗?还是启动程序并在以后杀死它的更好方法?

谢谢澳洲人

4

1 回答 1

1

您正在使用squeezelite 的-z选项,该选项会守护进程。这解释了为什么要创建一个额外的进程。我认为最好的解决方案是使用 OS 守护程序工具(例如 start-stop-daemon),简化您使用 Python 执行的调用。有一个关于在 Debian squeeze 中守护 Squeezelite 的指南,它可以帮助您入门。

您需要启动该进程并将其 PID 保存在一个文件中,以便稍后停止它。一种方法可能是使用带有两个参数的守护程序脚本:开始/停止和按钮的标识符。

于 2013-08-07T22:49:37.277 回答