bash:スクリプトを終了するために二重のCtrl-cを要求することは可能ですか?

rsaw:

エンドゴール:バックグラウンドジョブの完了を待機しているBASHスクリプトは、最初に中止されませんCtrl-c代わりに、Ctrl-c終了するのに1秒必要です。

BASHビルトインがどのように機能するかはよく知っていtrapます。次のいずれかを行うことができます。

  1. 信号を完全に無視するために使用します(例:trap '' 2)...または

  2. 本来の機能が起こることが許可されている信号の前に実行任意のコマンドを持っているためにそれを使用します(例えば、trap cmd 2ここで、cmd親スクリプトがのために中断される前に実行されますSIGINT

質問はこれに要約されます:

どうすれば12を効果的に組み合わせることができますか?つまり、信号がもたらす最終結果(1-たとえば、スクリプトのキャンセルによる停止SIGINT)を防止しながら、その信号に他の何かを引き起こします(2-たとえば、インクリメントaカウンター、カウンターを確認し、条件付きで警告を出力するか、終了します。

もっと簡単に言うと:

シグナルに他のことを完全に実行させるにはどうすればよいですか。ジョブを実行する前に挿入するだけではありません。

これが私が目指していることを示すためのサンプルコードです。ただし、上から1または2trapしか実行できないため、もちろん機能しません

#!/bin/bash
declare -i number_of_times_trap_triggered
cleanup_bg_jobs() {
    number_of_times_trap_triggered+=1
    if [[ ${number_of_times_trap_triggered} -eq 1 ]]; then
        echo "There are background jobs still running"
        echo "Hit Ctrl-c again to cancel all bg jobs & quit"
    else
        echo "Aborting background jobs"
        for pid in ${bg_jobs}; do echo "  Killing ${pid}"; kill -9 ${pid}; done
    fi
}
f() { sleep 5m; }
trap cleanup_bg_jobs 2
bg_jobs=
for job in 1 2 3; do
    f &
    bg_jobs+=" $!"
done
wait

したがって、これはCtrl-c1回押すと最終的に得られる出力です

[rsaw:~]$ ./zax 
^CThere are background jobs still running
Hit Ctrl-c again to cancel all bg jobs & quit
[rsaw:~]$ ps axf|tail -6 
24569 pts/3    S      0:00 /bin/bash ./zax
24572 pts/3    S      0:00  \_ sleep 5m
24570 pts/3    S      0:00 /bin/bash ./zax
24573 pts/3    S      0:00  \_ sleep 5m
24571 pts/3    S      0:00 /bin/bash ./zax
24574 pts/3    S      0:00  \_ sleep 5m

もちろん、最初Ctrl-cジョブをクリーンアップするように変更することもできますが、それは私が望んでいることではありません。最初のトラップがトリガーされた後、BASHが終了するのを止めたい... 2回目のトラップがトリガーされるまで。

PS:BASH v4 +を搭載したターゲットプラットフォームはLinux(POSIXコンプライアンスについてはあまり気になりませんでした)です。

rsaw:

同僚(グレガ)が私に解決策を与えてくれました...まあ、私はそれを最初に考えていなかったなんて信じられません。

「私のアプローチは... 2番目のハンドラーがその仕事を適切に実行できるように、決して戻らない関数または何か(別の待機?)を使用して、十分に長く、場合によっては永久にそれをレイオフすることです。」

記録としてwaitここは機能しません。(再帰的です。)ただし、sleep元のコードのcleanup_bg_jobs()関数にコマンドを追加すると、コマンドは処理されますが、プロセスが孤立します。そこで、プロセスグループを活用して、スクリプトのすべての子が実際に強制終了されるようにしました。後世の簡略化された例:

#!/bin/bash
declare -i count=
handle_interrupt() {
    count+=1
    if [[ ${count} -eq 1 ]]; then
        echo "Background jobs still running"
        echo "Hit Ctrl-c again to cancel all bg jobs & quit"
        sleep 1h
    else
        echo "Aborting background jobs"
        pkill --pgroup 0
    fi
}
f() { tload &>/dev/null; }
trap handle_interrupt 2
for job in 1 2 3; do
    f &
done
wait

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JavaScriptでXOR二重リンクリストを作成することは可能ですか?

分類Dev

Joiで二重リンクリストを作成することは可能ですか?

分類Dev

ロビンDNS要求を丸めることは可能ですか?

分類Dev

CommonJS-関数を要求することは可能ですか?

分類Dev

二重循環リンクリストを逆にすることは可能ですか?はいの場合、どのように?

分類Dev

宝石内にBashスクリプトを含めることは可能ですか?

分類Dev

プログラムを呼び出すためのbashスクリプトでの二重引用符と一重引用符の両方の使用

分類Dev

C ++ポリモーフィズム:二重派生クラスから基本クラスへの関数を使用することは可能ですか?

分類Dev

Pythonのshモジュール-スクリプトが入力を要求することは可能ですか?

分類Dev

かっこ "] ["がシェルによる解釈を防ぐために二重エスケープ "\\"を必要とするのはなぜですか?

分類Dev

シェルスクリプトでこの変数を定義するときに二重引用符が必要なのはなぜですか?

分類Dev

bashスクリプトで、JSONデータセット{}内の二重引用符の間のすべての二重引用符を削除する方法

分類Dev

リストまたはデータフレームの要素にアクセスするための角かっこ[]と二重角かっこ[[]]の違い

分類Dev

awkに `exit 2`でbashスクリプトを終了させることは可能ですか?

分類Dev

二重分割せずに、解析されていない文字列のリストから辞書内包表記を構築することは可能ですか?

分類Dev

サブクラスにオプションの変数を要求することは可能ですか?

分類Dev

この古いC ++二重リンクリストコードをC ++ 11に更新するにはどうすればよいですか?

分類Dev

2つの二重リンクリストを追加するためのオーバーロード演算子

分類Dev

ライブラリから実行時のアクセス許可を要求することは可能ですか?

分類Dev

このbashスクリプトの抜粋の二重ダッシュは何をしていますか

分類Dev

Vueを使用してHTML属性内に二重中括弧を含めることは可能ですか?

分類Dev

オブジェクトがnullでないことを確認するために、二重の感嘆符(!!)を使用する必要がありますか?

分類Dev

私はこのbashスクリプトを持っていますが、終了出口を取得するためにどのように改善できますか?

分類Dev

C ++の二重リンクリストから重複を削除する

分類Dev

二重にリンクされたリストの最後からポップする方法は?

分類Dev

Pythonスクリプトを独自のOSにすることは可能ですか?

分類Dev

cssで数値の二重アウトラインを作成することは可能ですか?

分類Dev

ASP.NETのビューからの二重要求を回避するためのベストプラクティス

分類Dev

この単一リンクリストを二重リンクリストにするにはどうすればよいですか?

Related 関連記事

  1. 1

    JavaScriptでXOR二重リンクリストを作成することは可能ですか?

  2. 2

    Joiで二重リンクリストを作成することは可能ですか?

  3. 3

    ロビンDNS要求を丸めることは可能ですか?

  4. 4

    CommonJS-関数を要求することは可能ですか?

  5. 5

    二重循環リンクリストを逆にすることは可能ですか?はいの場合、どのように?

  6. 6

    宝石内にBashスクリプトを含めることは可能ですか?

  7. 7

    プログラムを呼び出すためのbashスクリプトでの二重引用符と一重引用符の両方の使用

  8. 8

    C ++ポリモーフィズム:二重派生クラスから基本クラスへの関数を使用することは可能ですか?

  9. 9

    Pythonのshモジュール-スクリプトが入力を要求することは可能ですか?

  10. 10

    かっこ "] ["がシェルによる解釈を防ぐために二重エスケープ "\\"を必要とするのはなぜですか?

  11. 11

    シェルスクリプトでこの変数を定義するときに二重引用符が必要なのはなぜですか?

  12. 12

    bashスクリプトで、JSONデータセット{}内の二重引用符の間のすべての二重引用符を削除する方法

  13. 13

    リストまたはデータフレームの要素にアクセスするための角かっこ[]と二重角かっこ[[]]の違い

  14. 14

    awkに `exit 2`でbashスクリプトを終了させることは可能ですか?

  15. 15

    二重分割せずに、解析されていない文字列のリストから辞書内包表記を構築することは可能ですか?

  16. 16

    サブクラスにオプションの変数を要求することは可能ですか?

  17. 17

    この古いC ++二重リンクリストコードをC ++ 11に更新するにはどうすればよいですか?

  18. 18

    2つの二重リンクリストを追加するためのオーバーロード演算子

  19. 19

    ライブラリから実行時のアクセス許可を要求することは可能ですか?

  20. 20

    このbashスクリプトの抜粋の二重ダッシュは何をしていますか

  21. 21

    Vueを使用してHTML属性内に二重中括弧を含めることは可能ですか?

  22. 22

    オブジェクトがnullでないことを確認するために、二重の感嘆符(!!)を使用する必要がありますか?

  23. 23

    私はこのbashスクリプトを持っていますが、終了出口を取得するためにどのように改善できますか?

  24. 24

    C ++の二重リンクリストから重複を削除する

  25. 25

    二重にリンクされたリストの最後からポップする方法は?

  26. 26

    Pythonスクリプトを独自のOSにすることは可能ですか?

  27. 27

    cssで数値の二重アウトラインを作成することは可能ですか?

  28. 28

    ASP.NETのビューからの二重要求を回避するためのベストプラクティス

  29. 29

    この単一リンクリストを二重リンクリストにするにはどうすればよいですか?

ホットタグ

アーカイブ