スクリプトからスクリプトへシグナル SIGINT を送信するにはどうすればよいですか?
質問
Script-A.shからScript-B.Shに送信される信号をトラップしたいので、スクリプト-A.shでコマンドを使用します。
(SIGINTをScript-B.shに送信)
kill -2 $PID_Script-B.sh
そして、Script-B.sh でシグナルをキャッチし、関数 Clean を呼び出します。
トラップ「クリーン」2
これは機能せず、Script-B.sh は Clean !! を実行せずにすぐに強制終了されます。
また、私が気づいたのは、端末から SIGINT をトラップするスクリプトに送信したい場合、 ctrl-c
正しくキャッチされますが、コマンドでシグナルを指定した場合はキャッチされません kill -2 $pid_of_script
SIGINT を送信する 2 つの方法の違いについてのアイデア (ctrl-c
VS kill -2 $pid_of_script
)、そしてスクリプトから別のスクリプトに SIGINT を送信するにはどうすればよいですか?
解決
ご報告いただいた動作を再現することができました。私の仮説は、スクリプトが実行されているため、 から 非対話型シェル (スクリプトの子として) SIGINT
, キーボード信号である は無視されます。
から info bash
:
背景プロセスとは、プロセスグループIDが端末とは異なるものです。このようなプロセスはキーボードで生成された信号の影響を受けません。
あなたがそうであれば、私はそれを見つけました trap
そして kill
などの別の信号を使用する SIGUSR1
それは動作します。
からの追加情報 man bash
:
bash によって実行される非組み込みコマンドには、シェルによって親から継承された値が設定されたシグナル ハンドラーがあります。ジョブ制御が有効ではない場合、非同期コマンドは、これらの継承されたハンドラーに加えて、SIGINT および SIGQUIT を無視します。
そして
bash がコマンドの完了を待機していて、トラップが設定されたシグナルを受信した場合、コマンドが完了するまでトラップは実行されません。
そして
SIGCHLD 上のトラップは、終了する子ごとに実行されます。
他のヒント
でスクリプトA:トラップ機能はscriptA.shにtrap_mesg()関数を呼び出しますされ、次のようになります。 KILL信号(2 /割り込み、5 / TERMINATE-デフォルト)。すべては、あなたがしなければならないscriptB.shは、
(nohupを...&あなたや使用のpsコマンドを与える)scriptA.shから呼び出された後runingてscriptB.shプロセス/セッションのPIDを取得することですtrap_mesg ()
{
#...do something here for script B..
# i.e.
kill -2 PID_of_ScriptB.sh_running_process_session
sleep 10; #just in case, not reqd though.
#show using ps -eAf|grep "scriptB" ... if null means, scriptB is gone. user is happy now.
#...before actually exiting out...
#show script A is exiting out as ScriptB is dead already, time for scriptA now.
#...do something here..
}
#####################################
## Trap signals : INT, TERM. catch ##
#####################################
#Set NULL/Blank value to trap_call. This variable will help in running trap_mesg only once during the life of this script.
trap_call="";
trap 'if [ -z ${trap_call} ]; then trap_call="1"; trap_mesg ; fi' 2 15
##################################
さて、scriptB.sh内、(クリーンコールするように)同じ/似ていますが、ちょうどscriptBトラップジョブの操作を行います。
clean ()
{
echo "karoge seva to milega meva";
rm -fr /some/folder_file
}
trap_mesg ()
{
#...do something here JUST for script B trap message work..
# i.e.
clean;
#...do something here..
}
#####################################
## Trap signals : INT, TERM. catch ##
#####################################
#Set NULL/Blank value to trap_call. This variable will help in running trap_mesg only once during the life of this script.
trap_call="";
trap 'if [ -z ${trap_call} ]; then trap_call="1"; trap_mesg ; fi' 2 15
##################################
このようにして、
"....。scriptB.sh" としてscriptA.sh内のソース/コールscriptB.shに持っていけません