私は自家製の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」シグナルを送信する必要があります。これを行うには、-9
kill コマンドに追加します。
特定のユースケースを考慮すると、シェルスクリプトにmameプロセスを終了するためのSIGHUPハンドラがある場合があります(プロセスIDが必要なため)、スクリプトを実行してArduinoトリガーはスクリプトにSIGHUPを送信するだけです。このメカニズムにより、killはSIGHUP(を使用して-1
)を送信し、コイン信号を待つループに戻ることができます。