web-dev-qa-db-ja.com

割り込みシグナルを子プロセスだけに制限するにはどうすればよいですか?

たくさんのログファイルがあり、Ctrl-Cを押すと、現在のtail -fが強制終了され、次のログファイルに進むようにループでtail -fを実行したいと思います。

for log in *.log; do
    printf '%s\n' "Tailing log '$log'; press Ctrl-C to skip to the next"
    tail -f "$log"
done

問題は、Ctrl-Cを押すとループ自体が強制終了されることです。割り込みシグナルを子プロセス(この場合はtail)だけに制限するにはどうすればよいですか?

2
codeforester

プット

trap ":" SIGINT

ループの前。これにより、シェルは信号を無視します。ただし、シグナルハンドラの意味で「無視」するのではなく、ダミーコマンドを実行するという意味で。

シェルプロセスは(カーネルの観点から)このシグナルをブロックしないため、子プロセス(この例ではtailなど)に到達します。

2
Hauke Laging