スクリプトからスクリプトへシグナル SIGINT を送信するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2524937

  •  22-09-2019
  •  | 
  •  

質問

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に持っていけません
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top