2017-09-05 22 views
8

2つのtrapハンドラを登録し、trap -pで表示する単純なプログラムです。それは同じことをしますが、子供のバックグラウンドプロセスで行います。bash:バックグラウンドシェルでSIGINTのトラップを設定できないのはなぜですか?

なぜバックグラウンドプロセスはSIGINTトラップを無視しますか?

#!/bin/bash 

echo "Traps on startup:" 
trap -p 
echo "" 

trap 'echo "Received INT"' INT 
trap 'echo "Received TERM"' TERM 

echo "Traps set on parent:" 
trap -p 
echo "" 

(
    echo "Child traps on startup:" 
    trap -p 
    echo "" 

    trap 'echo "Child received INT"' INT 
    trap 'echo "Child received TERM"' TERM 

    echo "Traps set on child:" 
    trap -p 
    echo "" 
) & 

child_pid=$! 
wait $child_pid 

出力:(彼らは上のset -mをバックグラウンドにしている場合を除き)

$ ./show-traps.sh 
Traps on startup: 

Traps set on parent: 
trap -- 'echo "Received INT"' SIGINT 
trap -- 'echo "Received TERM"' SIGTERM 

Child traps on startup: 

Traps set on child: 
trap -- 'echo "Child received TERM"' SIGTERM 

答えて

6

SIGINTSIGQUITがバックグラウンドにプロセスでは無視されます。これは(奇妙な)POSIX要件です(詳細はhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.htmlまたは私のSO質問Why do shells ignore SIGINT and SIGQUIT in backgrounded processes?を参照してください)。サブシェルが入力されると

、無視されていないトラップが一つだけを含むコマンド 置換の場合を除き、デフォルトのアクションに セットしなければならない:さらに、POSIXがあること

が必要ですそれは無視されますので、trapコマンドが..

しかし、あなたはそれがリセットされた後、再度サブシェルでINTハンドラを設定した場合でも、susbshel​​lはそれを受け取ることができません(あなたはそれを試すこともできますし、検査することができます信号はを使用して無視されます)。

+0

'set -m'を少し拡張することができますか?それは何であり、どのようにすることができますか?私はbgプロセスにSIGINTを送ることができる回避策を探しています。どうも。 – drevicko

+0

@revickoマンページの 'monitor'を検索します。監視モード( 'set -m')はコマンド(パイプライン)を別のプロセスグループで実行させます。あなたはそれを望んでいないかもしれません。しかし、バックグラウンドプロセスで実行可能ファイルを実行している場合は、SIGINTを元に戻すラッパーを使用して起動するのは簡単です(何もせずに)。 (もしあなたがそれをやる方法がわからないのであれば、その質問を投稿してください)、 – PSkocik

+0

ありがとう!質問は[ここ](https://stackoverflow.com/questions/49178556/how-do-i-launch-a-background-process-through-a-wrapper-thatll-undo-the-siginti-i)です。 – drevicko

関連する問題