たくさんのログファイルがあり、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
)だけに制限するにはどうすればよいですか?
プット
trap ":" SIGINT
ループの前。これにより、シェルは信号を無視します。ただし、シグナルハンドラの意味で「無視」するのではなく、ダミーコマンドを実行するという意味で。
シェルプロセスは(カーネルの観点から)このシグナルをブロックしないため、子プロセス(この例ではtail
など)に到達します。