Bash에서 이 프로세스를 종료하는 방법

Bash에서 이 프로세스를 종료하는 방법

저는 집에서 만든 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" 신호를 보내야 할 수도 있습니다. 이렇게 하려면 -9kill 명령에 추가하면 됩니다.

특정 사용 사례를 고려하면 쉘 스크립트에 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의 도움으로 프로세스를 종료합니다. 시도 해봐

관련 정보