web-dev-qa-db-ja.com

Enterキーを押さずにバックグラウンドジョブからのシグナルトラップ

Bash 5で、次のことを実行したい状況に遭遇しました。

trap 'echo trapped!' USR1
while true; do kill -SIGUSR1 $$; sleep 1; done &

しかし、トラップコードを続行するには、信号が送信されるたびにキーボードのEnterキーを押す必要があります。

実際、私はトラップがキーボードの操作なしで実行されることを期待しています。

編集:

最後に、私はそれを次のように機能させました:

trap 'echo trapped!' USR1
while true; do kill -USR1 $$; kill -INT $$; sleep 1; done &

しかし、私は解決策を答えではなく回避策と考えています。

1
Dominik Kummer

誰かが非常によく似た問題を抱えているようです ここ
サブプロセスに組み込まれているトラップ(この場合は「echotrapped!」)からコマンドを実行しても問題がない場合は、簡単に説明します。コマンドをファイル(たとえば、a.sh)に入れることができます。

trap 'echo trapped!' USR1
while true; do kill -USR1 $$; sleep 1; done

bash a.sh &を使用してバックグラウンドプロセスとしてファイルを実行します
サブプロセスでそれを行うことができない場合、対話型シェルはユーザーがコマンドを入力するのを待っている間にブロッキング読み取り操作を実行し、それが行われている間はほとんどのシグナルを処理しないため、良い解決策はありません(お気づきのように、SIGINTを処理します)。トラップは非対話型シェルにあるため、上記の解決策は機能します(したがって、シグナルを取得するときに読み取りをブロックしている途中ではありません)。

3
Daniel Atanasov