flockでデッドロック




manにかかれている内容そのままではあるけれども、先日ハマったので記録しておく。

flock() によって作られるロックは、 オープンファイル記述 (open file description) (open(2) 参照) と関連付けられる。 したがって、ファイルディスクリプターの複製 (fork(2) や dup(2) などにより作成される) は同じロックを参照し、 これらのファイルディスクリプターのどれを使っても このロックを変更したり解放したりできる。 また、ロックの解放は、 上記の複数のファイルディスクリプターのいずれかに対して 明示的に LOCK_UN 操作を指示した場合か、これらのファイルディスクリプターがすべて 閉じられた場合に行われる。

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/flock.2.htmlより

要はflockでロックを掛けた場合、大抵の場合はcloseでファイルディスクリプターを閉じればロックも解放されるのだけれども、そうではない場合もあるということ。この場合、複数のプロセスで同じファイルに対するファイルディスクリプターを持っているので、/proc/locksでロックを掛けたままになっているプロセスとinode番号を確認したあと、lsofコマンドでどのプロセスがそのinode番号のファイルをオープンしているかチェックすれば、ファイルディスクリプターを閉じていないプロセスがわかるはず。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です