كيف ترسل إشارة sigint من البرنامج النصي إلى البرنامج النصي؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

أرغب في فخ إشارة إرسال من Script-a.sh إلى Script-B.Sh ، لذا في Script-A.Sh أستخدم الأمر:

(أرسل sigint إلى Script-B.SH)
Kill -2 $ PID_SCRIPT -B.SH

وفي البرنامج النصي-ب.

فخ "نظيف" 2

إنه لا يعمل ، بدلاً من ذلك ، يتم قتل البرنامج النصي-B.SH على الفور دون القيام بالنظافة !!

ما لاحظته أيضًا هو أنه إذا كنت أرغب في إرسال Sigint من Terminal إلى أي نص يرخصه ، أ ctrl-c سيتم القبض عليه بشكل صحيح ، ولكن ليس إذا قمت بتحديد الإشارة عبر الأمر kill -2 $pid_of_script

أي فكرة عن الفرق بين الطريقتين لإرسال sigint (ctrl-c ضد kill -2 $pid_of_script) ، وكيف يمكنني إرسال sigint من نص إلى آخر؟

هل كانت مفيدة؟

المحلول

تمكنت من إعادة إنتاج السلوك الذي أبلغته. فرضيتي هي أنه بما أن البرنامج النصي يعمل من عند قذيفة غير تفاعلية (كطفل نصي) SIGINT, ، وهي إشارة لوحة المفاتيح ، يتم تجاهلها.

من عند info bash:

عمليات الخلفية هي تلك التي يختلف معرف مجموعة العملية عن المحطة ؛ مثل هذه العمليات محصنة من إشارات لوحة المفاتيح.

لقد وجدت أنه إذا كنت trap و kill باستخدام إشارة أخرى مثل SIGUSR1 إنها تعمل.

معلومات إضافية من man bash:

الأوامر غير المبنية التي يتم تشغيلها بواسطة Bash لها معالجات إشارات تم تعيينها على القيم الموروثة بواسطة القشرة من والدها. عندما لا تكون التحكم في الوظائف سارية ، تتجاهل الأوامر غير المتزامنة Sigint و Sigquit بالإضافة إلى هذه المعالجات الموروثة.

و

إذا كان Bash ينتظر إكمال أمر وتلقي إشارة تم تعيين مصيدة عليها ، فلن يتم تنفيذ الفخ حتى يكتمل الأمر.

و

يتم تنفيذ أي فخ على sigchld لكل طفل يخرج.

نصائح أخرى

في البرنامج النصي A: سوف تبدو وظيفة Trap مثل اتباع وظيفة Trap_Mesg () في scripta.sh. اقتل إشارة (2/مقاطعة ، 5/إنهاء الافتراض). كل شيء ، عليك القيام به هو الحصول على PID من عملية/جلسة ScriptB.SH Running بمجرد أن يتم استدعاء ScriptB.sh من Scripta.sh (nohup ... وسيعطيك أو استخدام أمر PS)

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).

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