Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー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のプロセスを親に持つ子プロセスを探している。

Man page of PROC

にあるようにstatファイルにはそのプロセスの親のIDが4列目に書いてある。これを利用してawkで検索をしている。あとはreadlinkでシンボリックリンクの先を出力している。末尾の/fd/1というのはファイル記述子を表している。ファイル記述子というのが何のための仕組みなのか正直わからないがまたそのうち調べようと思う。