如何在bash中杀死这个进程

如何在bash中杀死这个进程

我正在尝试将我的自制 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 杀死进程。试一试

相关内容