lessでFコマンドを使うと、バックグラウンドで走らせていたtailがなぜか終了する
Q&A
Closed
タイトルの通りなのですが、Bashスクリプト内でlessコマンドを呼び出しファイルへの追記を監視すると、全く無関係にバックグラウンド実行していたtailコマンドが終了してしまいます。
#!/bin/bash
mytrap() {
kill "$tailpid"
}
trap mytrap EXIT
tail -f ./tail.txt > >(cat > ./output.txt) &
tailpid=$!
less ~/.bashrc
現象が再現するできるだけ単純なシェルスクリプトを書いてみました。
内容はなんでもいいのでtail.txtという名前のファイルをカレントディレクトリに用意して、上のシェルスクリプトを実行してみてください。
lessコマンドによってBashの設定ファイルの内容が表示されると思います。
そのままqキーを押していただくと、lessコマンドが終了します。
lessコマンドの終了をもってシェルスクリプト自体も終了し、その際関数mytrap
が呼び出されることでバックグラウンドで走っていたtail -f
も終了します。
では次に、もう一度シェルスクリプトを実行してください。
またlessコマンドの画面が表示されますが、今度はShift+Fを押して追記監視モードに入ってください。
入ったらすぐにCtrl+Cで通常モードに戻って大丈夫です。
その後、qキーを押してlessコマンドを終了します。
するとtail -f
を終了しようとしたkillコマンドが、「そのようなプロセスはありません」というエラーメッセージを吐きます。
psコマンドを使って調べてみると、どうもCtrl+Cで追記監視モードから抜けたときになぜかtail -f
が終了しているようです。
さらに奇妙なことに、tailコマンドの出力先がプロセス置換ではない通常のファイルであればこの現象は起こりません。
つまり、tail -f
のところの行を
tail -f ./tail.txt > ./output.txt &
とすると、tail -f
はkillされるまで生存します。
一応tailやlessのマニュアルは読んでみたのですが、なぜこのような現象が起こるのかわかりませんでした。
この挙動のせいで困っているわけではありませんが、どうしてこんなことになるのか気になります。
何が起こっているかわかる方がいらっしゃたらこの現象の解説をいただきたいです。