Bashでこのプロセスを終了する方法

Bashでこのプロセスを終了する方法

私は自家製のRaspberry Piベースのアーケードマシンにコインアクセサリを接続しようとしています。これを行うには、次のようにします。

  • コインを挿入すると、シェルスクリプト(ゲームプレイという名前)を使用してゲームエミュレータ(MAME)を起動します。
  • (希望)時間が経過したら、MAMEプロセスを終了し(RPiに接続されているArduinoインターフェースによって決定されます)、シェルスクリプトのループに戻り(スリープして)、コインを待ちます。

MAMEプロセスを終了できない以外はすべて正常です。

ここに画像の説明を入力してください。

詳しくは写真をご覧ください。最初のpstreeは、ゲームのプレイ中の進捗状況を示しています。 2番目の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)を送信し、コイン信号を待つループに戻ることができます。

おすすめ記事