シェルワンライナー160本ノック問題118
問題118 プロセスが開いているファイルの調査
問題のファイルは
https://github.com/shellgei/shellgei160
からダウンロードできる。
今回は事前に調べて問題解決ができないか考えたが、ファイル名がすでに分かっている場合に、どのプロセスがそれを開いているかを出力するコマンドfuserの解説ばかりでどうにも答えにたどり着けなかった。解答では先にサブシェルのプロセスIDを調べていた。問題のスクリプトをよく読むとこのスクリプトを実行したときのプロセスIDが最後に出力されていたのでこれがヒントになっていたのだろう。
解答例は
awk '$4==プロセスID{print $1}' /proc/[0-9]*/stat | xargs -I@ readlink /proc/@/fd/1
となる。最初のawkで何をやっているかというと問題のシェルスクリプトhidoi.bashのプロセスを親に持つ子プロセスを探している。
にあるようにstatファイルにはそのプロセスの親のIDが4列目に書いてある。これを利用してawkで検索をしている。あとはreadlinkでシンボリックリンクの先を出力している。末尾の/fd/1というのはファイル記述子を表している。ファイル記述子というのが何のための仕組みなのか正直わからないがまたそのうち調べようと思う。