簡體   English   中英

我的被​​叫腳本中有“捕獲'echo ignore'USR1”的字樣,為什么調用腳本被殺死?

[英]I have “trap 'echo ignore' USR1” in my called script, why does the calling script get killed?

說我有以下兩個bash腳本:

的/ tmp /捕手:

#!/bin/bash
trap 'echo trapper: ignoring USR1' USR1
"$(dirname $0)"/usr1er & p=$!
sleep 1
echo trapper: now killing usr1er
kill $p
echo trapper: sleeping
sleep 1
echo trapper: reached end of trapper

的/ tmp / usr1er:

#!/bin/bash
trap 'echo "usr1er: EXIT received, sending USR1"; kill -USR1 0' EXIT
while sleep 1;do echo usr1er: sleeping;done

捕獲程序應該捕獲USR1並直接忽略它。 它啟動usr1er,並使用USR1信號終止其進程組。 現在,如果我從交互式shell本身以腳本形式啟動trapper,它將殺死usr1er並正常退出:

$ /tmp/trapper; echo done
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
/tmp/trapper: line 9: 16596 Terminated              "$(dirname $0)"/usr1er
trapper: ignoring USR1
trapper: reached end of trapper
done

如果我嘗試$(/tmp/trapper) ,它將退出整個外殼。 同樣,如果我制作一個單獨的腳本來調用/tmp/trapper ,如/tmp/outer

#!/bin/bash
"$(dirname $0)"/trapper
echo outer: reached end of outer

它被殺死而沒有打印“外部的到達端”:

$ /tmp/outer
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
User defined signal 1
/tmp/trapper: line 9: 23544 Terminated              "$(dirname $0)"/usr1er
User defined signal 1
trapper: ignoring USR1
trapper: reached end of trapper

為什么?

看來, $() 以單獨的進程組/ PGID啟動過程(apparantly制作Cc工作)。

同樣,任何非交互式外殼程序也不會為其子級啟動單獨的PGID(除非您使用set -m打開作業控制):

$ bash -c '/tmp/trapper;echo done'
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
User defined signal 1
$ /tmp/trapper: line 9: 17522 Terminated              "$(dirname $0)"/usr1er
trapper: ignoring USR1
trapper: reached end of trapper

請注意,“ done”未打印,不會捕獲USR1的外部bash腳本會被殺死,而trapper會一直活到最后。

您可以通過在腳本中添加ps -o %p%r%c -p$$來檢查每個進程的PGID:

$ /tmp/outer
  PID  PGID COMMAND
27630 27630 outer
  PID  PGID COMMAND
27633 27630 trapper
  PID  PGID COMMAND
27635 27630 usr1er
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
User defined signal 1
$ /tmp/trapper: line 9: 27635 Terminated              "$(dirname $0)"/usr1er
trapper: ignoring USR1
trapper: reached end of trapper

試試這個變化

的/ tmp / usr1er:

#!/bin/bash
trap 'echo "usr1er: EXIT received, sending USR1"; kill -USR1 $PPID' TERM
while sleep 1;do echo usr1er: sleeping;done

處理了TERM信號而不是EXIT,並將USR1發送到$PPID而不是0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM