🗞️
bashの組み込みコマンドexecでファイルを閉じる
/opt/hoge/hoge.txtというファイルがあり、何かのプロセスによって書き込み可能な状態で開かれている。プロセスをkillせずにこのファイルを閉じたい。
- lsofでファイルを開いているプロセスを特定
- bashの組み込みコマンドexecを利用し、ファイルディスクリプタを指定して、
>&-
でリダイレクトして閉じる
# lsofでファイルを開いているプロセスとそのファイルディスクリプタの番号(FD)を特定する
# この場合77がファイルディスクリプタ番号
$ lsof /opt/hoge/hoge.txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 809 admin 77w REG 259,1 0 272875 /opt/hoge/hoge.txt
# bashの組み込みコマンドexecを使ってファイルを閉じる
# 「>」の前に空白を入れると、コマンドの引数の一部と解釈されるので空白は入れない
$ exec 77>&-
FDについて
シェル以外のプロセスは標準入出力0~2より後の数字、つまり3番以降を使用する。
lsofで情報を表示したときにファイルディスクリプタの番号(FD)の後ろについている数字は以下のような意味がある。
- r(read access)
- w(write access)
- u(readとwrite両方)
- cwd(カレントディレクトリ)
- mem(memory-mapped file)
- txt(program text)
参考:
Discussion