2 つの別々の端末で次の操作を行いました。
1期:
バックグラウンドでファイルに書き込みを行っているプロセスを開始します。
└──> while true; do date >> log; sleep 1; done &
[1] 20604
バックグラウンドで実行されている最後のプロセスの PID を取得します。
└──> echo $!
20604
2学期:
書き込み中のファイルの内容を表示します。
└──> tail -f log
Thu May 7 18:48:20 CEST 2015
Thu May 7 18:48:21 CEST 2015
Thu May 7 18:48:22 CEST 2015
Thu May 7 18:48:23 CEST 2015
Thu May 7 18:48:24 CEST 2015
Thu May 7 18:48:25 CEST 2015
Thu May 7 18:48:26 CEST 2015
Thu May 7 18:48:27 CEST 2015
前期:
誰がファイルにアクセスしているかを確認します (リーダーしかいないことに注意してください)
└──> lsof log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 21038 wakatana 3r REG 8,1 5340 797966 log
2番目の端末の後に終了し、空の出力をkill
返した後:tail -f
lsof
└──> kill 21038
└──> lsof log
└──>
2学期:
その後tail -f
、もう一度開始したところ、データがまだログ ファイルに書き込まれていることがわかりました。これは、一部のプロセスがまだログ ファイルに書き込み中であることを意味します。
└──> tail -f log
Thu May 7 18:52:33 CEST 2015
Thu May 7 18:52:34 CEST 2015
Thu May 7 18:52:35 CEST 2015
Thu May 7 18:52:36 CEST 2015
Thu May 7 18:52:37 CEST 2015
Thu May 7 18:52:38 CEST 2015
Thu May 7 18:52:39 CEST 2015
Thu May 7 18:52:40 CEST 2015
この場合、ファイルに書き込んでいるプロセスの不思議な PID を実際に知っています。それは PID 20604 なので、それを強制終了すると、ログ ファイルの成長が止まります。
私の質問は次のとおりです。
lsof
実際にログファイルに書き込んでいるプロセスが(繰り返し発行されても)表示されないのはなぜですか?20604 が属していることを理解してbash
おり、ファイルに直接書き込みを行っているのは bash ではなく、 childdate
です。しかし、lsof
どちらbash
も表示されませんでしdate
た。- PID 20604 がわからない場合はどうすればよいですか? では、書き込みプロセスをどのように追跡できますか?
PS: 使用したシェル: GNU bash、バージョン 4.2.37(1)-release (x86_64-pc-linux-gnu)