🗞️

bashの組み込みコマンドexecでファイルを閉じる

2023/01/06に公開

/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