Como matar este processo no bash

4

Estou tentando fazer interface com minha máquina de arcade Raspberry Pi caseira com um aceitador de moedas e, para isso, eu:

  • use um script de shell (denominado gameplay) que inicia o emulador de jogos (MAME) quando uma moeda é inserida
  • (quer) matar o (s) processo (s) MAME (s) quando o tempo acabar (decidido por uma interface do Arduino conectada ao RPi), e voltar para o loop no script de shell para (dormir e) aguardar

está tudo bem, exceto que não consigo matar o processo MAME.

Porfavor,vejaafotoparamaisdetalhes.Oprimeiropstreemostraosprocessosquandoumjogoestásendojogado.Eosegundopstreeéquandootempoacabou,eoprocesso"emulationstation" foi eliminado pelo script shell da jogabilidade (por sudo killall emulationstation).

Mas o processo "mame" ainda está lá e o jogo ainda pode ser jogado. Eu também tentei "sudo killall mame", mas não funciona.

Eu tenho tentado de várias maneiras, mas nenhuma delas funcionou até agora.

Eu sou obrigado a qualquer conselho oferecido.

ATUALIZE DEPOIS DE ALGUNS COMENTÁRIOS DO SEU TIPO

Descobri que todos os processos no ramo podem ser eliminados, exceto pelo processo "mame", não importa o que eu tentei. O melhor esforço sempre resulta em "mame" se tornando um sub-ramo de "init" como: "init-mame --- 5 * [{mame}]". Correndo "sudo killall mame" aqui não dá nada - sem erro, sem efeito. Por que não posso simplesmente matar esse processo? (e este é um processo do usuário "pi").

Então eu tentei uma matança mais violenta, como @Colin Ameigh sugeriu abaixo: "killall -9 mame" depois da "estação de emulação killall". E o ALMOST funciona, só que algo foi estragado no script "gameplay" - o terminal fica em branco, e o texto INSERT COIN ... não está mais lá (mas, exceto por isso, ele funciona como pretendido, eu também não o faço) Lembre-se de notar qualquer processo zumbi). Aqui está o conteúdo do script de jogo:

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
    
por Dave 01.07.2015 / 11:38

3 respostas

1

Para uma abordagem mais geral para matar processos ...

Este comando deve mostrar o processo

pgrep -f runcommand.sh

Em seguida, recorte e cole o ID do processo

kill PROCESSID

ou, se você for um pouco mais corajoso usando canos

pgrep -f runcommand.sh | xargs -I{} kill {}

Se você não tem pgrep (por algum motivo), então você pode substituir o comando pgrep com essa monstruosidade:

ps aux | grep "[r]uncommand.sh" | sed 's/\s\+/ /g' | cut -f 2 -d ' '

A parte "[r] uncommand.sh" apenas garante que o grep não encontre seu próprio ID de processo também.

Se o comando kill não encerrar o processo, talvez seja necessário enviar um sinal "SIGKILL". Para isso basta adicionar -9 ao comando kill.

Dado seu caso de uso específico - talvez o shell script tenha um manipulador SIGHUP que mata o processo mame (já que ele deve ter o ID do processo) deixando o script em execução e o gatilho do arduino precisa enviar um SIGHUP ao script (através deste mecanismo, kill pode enviar SIGHUP com -1 ), que pode então retornar a um loop esperando pelo sinal de moeda.

    
por 01.07.2015 / 13:02
0

Experimente sudo killall --process-group emulationstation

    
por 01.07.2015 / 11:47
0

Tente

killall runcommand.sh

EDITAR:

 |─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: ~ # killo 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

Depois de executar o comando, todas as instâncias de nemo são eliminadas. Embora possamos enviar o sinal. Mas eu prefiro killall . Por isso, sugerimos o comando acima.

EDIT 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

No script acima, salve o PID do script em uma variável e mate o processo com a ajuda do PID. Experimente>

    
por 01.07.2015 / 12:28