2016-10-06 33 views
0

過程A設置陷阱。然後它創建一個子進程B.如何清除進程A設置的陷阱?如何清除由父進程設置的子進程中的陷阱?

processA

#! /bin/bash 
# processA.sh 
trap '' 15 
sh processB.sh 

進程B

#! /bin/bash 
# processB.sh  
echo "Current trap" 
trap -p  
echo "Clearing trap 15" 
trap - 15  
echo "New trap" 
trap -p 

輸出

Current trap 
trap -- '' TERM 
Clearing trap 15 
New trap 
trap -- '' TERM 

在上面的例子中,我清除在子進程B中的陷阱,但它不是得到清潔d。操作系統是Linux。

回答

0

一般來說,您可以使用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

+0

好的。是的,我無法控制我正在處理的問題中的父流程。因爲沒有其他選擇,所以我必須用-9來殺死進程,因爲15不會工作。 +1爲iqon – bluetech