一般來說,您可以使用trap 15
來取消信號15的陷阱。這包括在當前shell開始忽略它時將忽略信號重置爲默認值。
但是,一些實驗(在macOS Sierra 10.12上使用Bash 3.2.57)顯示,如果信號在進程開始時被忽略(從父進程繼承),則無法重置爲默認處理 - 它會繼續被忽略。此外,像trap ': do nothing' 15
之後的trap 15
這樣的嘗試不會完成這項工作。我寫了一個名爲iqon
(中斷,在1989年退出 - 第一個版本)的C程序,以確保信號被它執行的命令所捕獲(或忽略)。
iqon -s 15 -- bash processB.sh
此主題工作的變化。
注意的iqon
一個頭腦簡單的版本,只設置信號SIGTERM爲默認狀態(沒有參數處理)可能是簡單的:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
if (argc <= 1)
{
fprintf(stderr, "Usage: %s cmd [arg ...]", argv[0]);
return 1;
}
signal(SIGTERM, SIG_DFL);
execvp(argv[1], &argv[1]);
perror(argv[1]);
return 1;
}
很明顯,你可以把它更加複雜,沒有任何困難。我的版本支持這樣的幫助信息:
Usage: iqon [-dhV] [-s signal] [-i signal] cmd [args ...]
-d Set interrupt and quit to default
-h Print this help and exit
-i signal Ignore signal (number)
-s signal Set default for signal (number)
-V Print version information and exit
默認(設置中斷,並退回到默認行爲)是其初衷的傳統 - 由一個4GL,其中中斷和創建的程序內運行的程序退出信號被忽略。這也是名字來自:i
nterrupt和q
uit on
。
好的。是的,我無法控制我正在處理的問題中的父流程。因爲沒有其他選擇,所以我必須用-9來殺死進程,因爲15不會工作。 +1爲iqon – bluetech