我正在尝试将我的自制 Raspberry Pi 供电的街机与硬币接收器连接起来,为此我:
- 使用 shell 脚本(名为gameplay),在插入硬币时启动游戏模拟器(MAME)
- (想要)在时间到时终止 MAME 进程(由连接到 RPi 的 Arduino 接口决定),然后返回到 shell 脚本中的循环以(睡眠并)再次等待硬币
一切都很好,除了我似乎无法终止 MAME 进程。
请查看照片了解更多详情。第一个 pstree 显示玩游戏时的进程。第二个 pstree 是当时间到了时,“emulationstation”进程已被游戏 shell 脚本终止(通过 sudo Killall emulationstation)。
但“mame”进程仍然存在,游戏仍然可以玩。我也尝试过“sudo Killall mame”,但它不起作用。
我已经尝试了很多方法,但到目前为止没有一个有效。
在收到您的一些评论后更新
我发现无论我怎么尝试,除了“mame”进程之外,分支中的所有进程都可以被杀死。最好的杀戮努力总是会导致“mame”成为“init”的子分支:“init--mame---5*[{mame}]”。在这里运行“sudo Killall mame”没有给出任何结果 - 没有错误,没有效果。为什么我不能杀死这个进程? (这是“pi”用户的进程)。
然后我尝试了更暴力的杀戮,正如@Colin Ameigh 在下面建议的那样:“killall emulationstation”之后的“killall -9 mame”。它几乎可以工作,只是“游戏”脚本中有些东西搞砸了 - 终端变成空白,并且 INSERT COIN... 文本不再存在(但除此之外,它按预期工作,我也不知道)不记得注意到任何僵尸进程)。以下是游戏脚本的内容:
while true
do
clear
echo INSERT COIN...
while [[ $(cat /sys/class/gpio/gpio4/value) == '0' ]]; do
sleep 1
done
echo STARTING GAME...
#start game as separate process
emulationstation &
while [[ $(cat /sys/class/gpio/gpio4/value) == '1' ]]; do
sleep 1
done
sudo killall emulationstation
#sudo killall mame
sudo killall -9 mame
done
答案1
对于终止进程的更通用方法......
该命令应该显示进程
pgrep -f runcommand.sh
然后剪切并粘贴进程 ID
kill PROCESSID
或者,如果你更勇敢一点,使用管道
pgrep -f runcommand.sh | xargs -I{} kill {}
如果你没有 pgrep(由于某种原因),那么你可以用这个怪物替换 pgrep 命令:
ps aux | grep "[r]uncommand.sh" | sed 's/\s\+/ /g' | cut -f 2 -d ' '
“[r]uncommand.sh”部分只是确保 grep 也找不到自己的进程 ID。
如果kill命令没有结束进程,那么您可能需要发送“SIGKILL”信号。为此,只需添加-9
到kill命令中即可。
考虑到您的具体用例 - 也许shell脚本可以有一个SIGHUP处理程序来杀死mame进程(因为它应该有进程ID),让脚本运行,而arduino触发器只需要向脚本发送一个SIGHUP(通过这个机制中,kill可以发送SIGHUP(带有-1
),然后可以返回到等待硬币信号的循环。
答案2
尝试sudo killall --process-group emulationstation
答案3
尝试一下
killall runcommand.sh
编辑:
|─lightdm─┬─Xorg───2*[{Xorg}]
│ ├─lightdm─┬─init─┬─at-spi-bus-laun─┬─dbus-daemon
│ │ │ │ └─3*[{at-spi-bus-laun}]
│ │ │ ├─at-spi2-registr───{at-spi2-registr}
│ │ │ ├─bamfdaemon───3*[{bamfdaemon}]
│ │ │ ├─dbus-daemon
│ │ │ ├─dconf-service───2*[{dconf-service}]
│ │ │ ├─evolution───11*[{evolution}]
│ │ │ ├─evolution-calen───4*[{evolution-calen}]
│ │ │ ├─evolution-sourc───2*[{evolution-sourc}]
│ │ │ ├─firefox─┬─plugin-containe───8*[{plugin-containe}]
│ │ │ │ └─64*[{firefox}]
│ │ │ ├─gconfd-2
│ │ │ ├─gnome-session─┬─compiz───7*[{compiz}]
│ │ │ │ ├─deja-dup-monito───2*[{deja-dup-monito}]
│ │ │ │ ├─evolution-alarm───4*[{evolution-alarm}]
│ │ │ │ ├─hp-systray─┬─hp-systray───hp-systray
│ │ │ │ │ └─3*[{hp-systray}]
│ │ │ │ ├─nemo───3*[{nemo}] <= See this line
│ │ │ │ ├─nm-applet───2*[{nm-applet}]
│ │ │ │ ├─polkit-gnome-au───2*[{polkit-gnome-au}]
│ │ │ │ ├─python───2*[{python}]
│ │ │ │ ├─telepathy-indic───2*[{telepathy-indic}]
│ │ │ │ ├─unity-fallback-───2*[{unity-fallback-}]
│ │ │ │ ├─update-notifier───3*[{update-notifier}]
│ │ │ │ ├─zeitgeist-datah───6*[{zeitgeist-datah}]
│ │ │ │ └─3*[{gnome-session}]
│ │ │ ├─gnome-terminal─┬─bash───sudo───su───bash───pstree
│ │ │ │ ├─gnome-pty-helpe
│ │ │ │ └─3*[{gnome-terminal}]
│ │ │ ├─gpg-agent
root@SHW:~ # 杀死所有尼莫 root@SHW:~ # pstree
─lightdm─┬─Xorg───2*[{Xorg}]
│ ├─lightdm─┬─init─┬─at-spi-bus-laun─┬─dbus-daemon
│ │ │ │ └─3*[{at-spi-bus-laun}]
│ │ │ ├─at-spi2-registr───{at-spi2-registr}
│ │ │ ├─bamfdaemon───3*[{bamfdaemon}]
│ │ │ ├─dbus-daemon
│ │ │ ├─dconf-service───2*[{dconf-service}]
│ │ │ ├─evolution───11*[{evolution}]
│ │ │ ├─evolution-calen───4*[{evolution-calen}]
│ │ │ ├─evolution-sourc───2*[{evolution-sourc}]
│ │ │ ├─firefox─┬─plugin-containe───8*[{plugin-containe}]
│ │ │ │ └─54*[{firefox}]
│ │ │ ├─gconfd-2
│ │ │ ├─gnome-session─┬─compiz───7*[{compiz}]
│ │ │ │ ├─deja-dup-monito───2*[{deja-dup-monito}]
│ │ │ │ ├─evolution-alarm───4*[{evolution-alarm}]
│ │ │ │ ├─hp-systray─┬─hp-systray───hp-systray
│ │ │ │ │ └─3*[{hp-systray}]
│ │ │ │ ├─nm-applet───2*[{nm-applet}]
│ │ │ │ ├─polkit-gnome-au───2*[{polkit-gnome-au}]
│ │ │ │ ├─python───2*[{python}]
│ │ │ │ ├─telepathy-indic───2*[{telepathy-indic}]
│ │ │ │ ├─unity-fallback-───2*[{unity-fallback-}]
│ │ │ │ ├─update-notifier───3*[{update-notifier}]
│ │ │ │ ├─zeitgeist-datah───6*[{zeitgeist-datah}]
│ │ │ │ └─3*[{gnome-session}]
│ │ │ ├─gnome-terminal─┬─bash───sudo───su───bash───pstree
│ │ │ │ ├─gnome-pty-helpe
│ │ │ │ └─3*[{gnome-terminal}]
│ │ │ ├─gpg-agent
执行命令后,所有实例都nemo
被杀死。虽然我们可以发送信号。但是我更喜欢killall
。因此建议使用上面的命令。
编辑2:
while true
do
clear
echo INSERT COIN...
while [[ $(cat /sys/class/gpio/gpio4/value) == '0' ]]; do
sleep 1
done
echo STARTING GAME...
#start game as separate process
emulationstation & emuPID=$! <= This
while [[ $(cat /sys/class/gpio/gpio4/value) == '1' ]]; do
sleep 1
done
sudo killall $emuPID <= and this
#sudo killall mame
sudo killall -9 mame
done
在上面的脚本中,将脚本的 PID 保存到变量中,并借助 PID 杀死进程。试一试