問題タブ [bash-trap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - 終了時にbashスクリプトのすべてのサブプロセスを強制終了する方法は?
名前付きパイプを使用して、プロデューサー、一部のリーダー、一部のライターの 3 種類のプロセス間で通信しています。次に、すべてのプロセスを単純に実行するスクリプトを作成しました。run.sh プロセスが強制終了されるか、すべての子プロセスが終了すると、プロセスも強制終了されます。run.sh スクリプトは次のとおりです。
スクリプトは非常に単純ですが、いくつかのプロセスが実行されているのがまだ見えるため、機能していないようです (producer.sh が強制終了されただけです)。
だから私はこれで殺す必要があります:
どうすればそれを機能させることができますか?
更新 1:
でバックグラウンドで実行されたジョブ&
は信号に抵抗できるようです。SIGINT
そのため、シンプルkill
では役に立ちません。kill -9
またはをトラップ内で使用すると、信号を受信しますが、適切に殺されたkill -TERM
だけで、生きたままになります。producer.sh
更新 2:
名前付きパイプでデータを待っているだけですreader_one.sh
。writer_one.sh
更新 3:read_one.sh
ここに;
のコードがあります。おそらくその理由は、パイプの直前にあるため、サブシェルですwhile
bash - bashでstdinから読み取るときに割り込み信号を処理する方法
私はbashの読み取り機能をいじっています。現在のシェルの上にあるシンプルなレイヤーとして、これまでのところ気に入っています。read -e はタブ補完と前のコマンドを実行し、ctrl+d で EOF を送信すると、元のシェルに戻ります。ここに私の参照があります:
Bash (または他のシェル): すべてのコマンドを関数/スクリプトでラップします。
SIGINT、ctrl+c の処理についてヘルプが必要です。通常のシェルでは、入力を開始して途中で ^C を押すと、すぐに行が終了します。この単純な例では、^C の後、登録される前にリターン キーを押す必要があります。
readline が行う優れた機能を維持しながら、SIGINT を正しく処理するにはどうすればよいですか? 理想的には、continue ステートメントを while read ループに送信するか、読み取りが待機している STDIN に何らかの方法で \n を送信します。
コード例:
python - シェル スクリプトでトラップをミュートする
多くのpythonスクリプトを呼び出すために使用しているシェルスクリプトがあります。シェル スクリプトにトラップを追加して、ctrl+c をキャッチして終了しました。しかし、Python スクリプトが実行されているときに ctrl+c を押すと、実行されていた Python スクリプトのブロックも表示されます! 私はそれを望んでいません。Python スクリプトに KeyboardInterrupt を追加するのがより良い方法であることはわかっていますが、それには多くの労力がかかります。ctrl+c を押すと、スクリプトの実行を制御してサイレントに終了するようなソリューションが必要です。
例: a.sh:
b.py:
a.sh を実行して ctrl+c を押したときに、次のような python ブロックを表示したくありません。
シンプルな「キーボード割り込み」メッセージで終了したい。
bash - トラップを Bash し、それらをキャプチャして、同じ関数の引数として渡します
いくつかのトラップを管理するスクリプトを開発しています。最初は、このコードで INT と SIGTSTP のみを管理していましたが、非常にうまく機能します。
次に、管理したい新しいトラップ、SIGINT と SIGHUP を追加しようとしました。最初の例では、これを行いました(これは機能しています):
次に、トラップに応じて終了時にさまざまなことを行うことにしましたが、それぞれに異なる関数を作成したくありません。bash では、命名法を使用して関数の引数をループできることを知っているfor item in $@; do
ので、試してみましたが、トラップの種類を区別しようとしても機能していないようです。動作しないこのコードを作成しました。
何か助けはありますか?すべてのトラップに対して 1 つの関数のみを使用してコードを改善する方法があるはずですが、方法がわかりません...
linux - Bash トラップ: ゼロ以外のステータスのサブプロセスの行番号を取得する方法
Bash プログラムの場合:
出力で:
trap
ゼロ以外のステータスで終了するサブシェルがキャッチされ、失敗したサブシェルの行番号が表示されるようにする方法を探しています。上記の例では、結果として行 20を探しています。エラーがサブシェルにない場合は、必要な行番号を取得することに注意してください (false
上記を参照)。
9
行番号が実際にトラップ呼び出しに接続されているかどうかを確認するために、サブシェルの直前にトラップを移動しようとしましたが、同じ結果が得られます。サブシェルにもset
andエントリを配置しようとしましたが、これも動作に変更はありません。shopt
環境:
- bash-4.2.46-21.el7_3.x86_64 : これは要件ですが、POSIX 準拠は必須ではありません。また、Bash の今後のリリース (4.2 以降) にも関心があります。
- CentOS 7+:主に CentOS に関心がありますが、最終的には Ubuntu 16.04+ および CentOS 6 に展開される Bash スクリプトにもこれが必要になります。
ゼロ以外のステータスを返すサブプロセスの行番号を取得することは可能ですか? それが不可能な場合、その趣旨の文書はありますか? 解決策が存在する場合は、コードに不要な装飾を加えることなく適切にスケーリングする必要があります。
bash - Bash のトラップの終了コード
これはmyscript.sh
次のとおりです。
そして、私がそれを実行すると:
スクリプトの終了コードが、トラップがある場合とない場合の終了コードが同じなのはなぜですか? 通常、関数は最後に実行されたコマンドの終了コードを暗黙的に返します。この場合:
- エコーは 0 を返します
mytrap
私は0を返すことを期待します- は最後に実行された関数であるため
mytrap
、スクリプトは 0 を返す必要があります
そうでないのはなぜですか?私の考えはどこが間違っていますか?
shell - シェル スクリプト中に NPM によって生成されたすべてのプロセスを強制終了する
おおよそ次のようなシェル スクリプトがあります。
実行時間の長いスクリプトが継続的に実行されていることを確認しますが、複数のインスタンスが並行して実行されるのを防ぐために、次を使用して cron 経由で呼び出します。
トラップを使用して、これをスクリプトの先頭に追加しようとしましたが、うまくいきませんでした:
のように、上記のさまざまなバリエーションも機能しませんでしたtrap "kill -HUP -$$"
。トラップが実行されていないようです (おそらく、すべてのインスタンスが$NPM run -s long_running_script
終了するのを待っているためですか?)。
子と孫の名前を知ってから実行する別のスクリプトからプロセスを強制終了することはできますがpkill
、より一般的なソリューションを好むでしょう。生成されたすべてのプロセスとその後続の子を手動で追跡せずに、シェル スクリプトから生成されたすべてのプロセスを強制終了する方法はありますか?
アップデート
出力をパイプ処理していることを示すために、スクリプト スニペットに詳細を追加しました。以下は、NPM によって生成されるプロセスのスナップショットです (ループの各反復で)。
lsof からの対応する出力:
更新 2
を呼び出すとfuser -k
、次のようになります。トップレベルのプロセスと npm のみが強制終了され、その孫は削除されません。