2013-04-25 23 views
10

予期しない入力でエラーを記録するエラーログの子スクリプトを呼び出すBash親スクリプトがあります。私はまた、エラーが発生し、エラースクリプトが呼び出されたときに実行を中止したい。しかし、エラー処理スクリプトからexitを呼び出すと、親スクリプトが実行されなくなります。子供から親スクリプトを止める方法はありますか?Bash - 子スクリプトからの親スクリプトの終了

答えて

10

してみてください。..そう

#normal flow 
[[ $(check_error_condition ]] && /some/error_reporter.sh || exit 1 

  • error_reporterが終了ステータスで終了します

    > 0親があまりにも
  • を終了します
  • :)(親は通常、この動作を好きではない)あなたはstop the parent from a childを望んでいない

... error_reporterは親が続く状態= 0で終了する場合は、あなたの代わりにtell to parent - need stop、彼をしたいです親スクリプトで

trap "echo exitting because my child killed me.>&2;exit" SIGUSR1 

で子供の

0

子から親を終了させないでください。代わりに子スクリプトが返された後で親にexitを呼び出します。

if [ condition ]; then 
    /path/to/child.sh 
    exit 1 
fi 

または短い

[ condition ] && { /path/to/child.sh; exit 1; } 
6

TRY);(必要な場合)自体を停止しますCRIPT:子スクリプトで

kill -SIGUSR1 `ps --pid $$ -oppid=`; exit 

他の方法だった

kill -9 `ps --pid $$ -oppid=`; exit 

しかし、親が殺さに関するいくつかの情報を持っている必要があるので、それは、推奨されません&必要に応じてクリーンアップを行います。


別の方法: 代わりの子スクリプトを呼び出し、execそれは。


しかし、他の答えで指摘されているように、最もきれいな方法は、子供が戻った後に親から出ることです。

+2

これはホラーのように見えます - 子供は親を殺す:) :)(はい、それも解決策です:)):) – jm666

+0

^^うん。次のようにします: 'command1 | (command 2; command3) '&command3はcommand1をSIGINTでkillするはずだった:-) – anishsane