3

ユーザーがCTRL+Cを押して実行をキャンセルした場合でも、bashスクリプトの最後でいくつかのコマンドを実行したいと思います。

別のプログラミング言語(Pythonなど)内からbashスクリプトを実行できるので、「finally」(try-finally)ブロックを使用してコードを実行できます。

しかし、StackOverflowがすばらしいアイデアを交換するための中心であることを知っているので、bashスクリプト内からやりたいことを実行する方法があるかどうかを尋ねています。

それで、アイデア?

編集:

私が欲しいのは、bash内で開かれたすべてのプロセス、つまりセレンとXvfbプロセスを強制終了することです。

私はこれをコードに書いてみました:

 trap "selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" EXIT

しかし、これにより、スクリプト内からサブプロセスを実行するたびに、次のように「CTRL+C」を何度も押す必要があります。

Testing nsi.bd.helpcenter ...^C:  --  Total time: 0min 0seg
Testing nsi.bibliography ...^C:  --  Total time: 0min 0seg
Testing nsi.digitallibrary ...^C:  --  Total time: 0min 0seg
Testing nsi.digitallibraryinstaller ...^C:  --  Total time: 0min 1seg
Testing nsi.digitallibraryskins ...^C:  --  Total time: 0min 0seg
....#continues

次のように、トラップラインのファイナルをEXITからSIGINTに変更します。

trap "selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" SIGINT

同じことをします。

最初のCTRL+Cで何を終了しますか?

文字列の最後に「exit1」を追加しようとしたので、 trap "... ;exit 1"

最初のCTRL+Cで終了するように機能しましたが、必要なプロセスを強制終了しませんでした。

アイデア?

4

2 に答える 2

8

私がこのコードで欲しかったものを手に入れました:

finalize_xvfb_and_selenium() {
    selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}')
    for pid in $selenium_pids; do 
        kill -9 $pid
    done 
    xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}') 
    for pid in $xvfb_pids; do 
        kill -9 $pid
    done
}

finalize_xvfb_and_selenium_and_exit() {
    finalize_xvfb_and_selenium
    echo -e "\n\nXvfb and seleniumrc finalized. Exiting ..."
    exit 13
}

#trap (CTRL+C) signal, to finalize proccess running before exit
trap finalize_xvfb_and_selenium_and_exit SIGINT

kill -9どこでも使用するよりも優れたリソースがあることを私は知っています。

于 2010-10-22T04:27:36.703 に答える
6

信号をトラップしたい。

ユーザーがターミナルでcontrol-cを押すと、OSは現在のプロセスにSIGINTを発行します。この信号はトラップされて処理される可能性があります。これをどのように行うかはシェルに依存する問題であり、シェルのマニュアルページを確認する必要があります。

一部の信号はトラップできないことに注意してください。kill -9特に、送信するものであるSIGKILL 。


編集に照らして:bashは、開始したプログラムのプロセスIDを返すことができます。の出力を解析する必要がないように、移動しながらそれらすべてをキャプチャすることが可能ですpsまた、子供たちが再帰的に子供たちを殺すように、すでにトラップを設定している他のシグナル(SIGUSR1など)を子供たちに送信することを検討することもできます。

そうは言っても、あなたは深い殻の魔法の領域に入ります。役立つかもしれない本がいくつかありますが、頭のてっぺんからタイトルがわかりません。

于 2010-10-21T21:48:39.723 に答える