![Bash에서 이 프로세스를 종료하는 방법](https://linux55.com/image/68147/Bash%EC%97%90%EC%84%9C%20%EC%9D%B4%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EC%A2%85%EB%A3%8C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
저는 집에서 만든 Raspberry Pi 기반 아케이드 머신에 동전 수용 장치를 연결하려고 합니다. 이를 위해 다음을 수행합니다.
- 코인을 삽입하면 쉘 스크립트(게임플레이라는 이름)를 사용하여 게임 에뮬레이터(MAME)를 시작합니다.
- (원함) 시간이 다 되면 MAME 프로세스를 종료하고(RPi에 연결된 Arduino 인터페이스에 의해 결정됨) 쉘 스크립트의 루프로 돌아가서 (잠자고) 코인을 다시 기다립니다.
MAME 프로세스를 종료할 수 없는 것 외에는 모든 것이 정상입니다.
자세한 내용은 사진을 참조하세요. 첫 번째 pstree는 게임을 플레이하는 동안 진행 상황을 보여줍니다. 두 번째 pstree는 시간이 다 되어 "emulationstation" 프로세스가 게임 쉘 스크립트(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 명령에 추가하면 됩니다.
특정 사용 사례를 고려하면 쉘 스크립트에 mame 프로세스를 종료하기 위한 SIGHUP 핸들러가 있을 수 있으며(프로세스 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:~ # 모든 Nemo를 죽입니다. 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의 도움으로 프로세스를 종료합니다. 시도 해봐