プロセスがディレクトリ内のファイルを使用しているかどうかをテストする方法

プロセスがディレクトリ内のファイルを使用しているかどうかをテストする方法

ディレクトリ内のファイルが他のプログラムで使用されていない場合にのみ、ディレクトリを圧縮するためにIFステートメントでlsofを使用してみました。シェルプロンプトからこの情報を取得できます

lsof +d /mydir/

出力が返されない場合、ディレクトリは使用されません。これを条件文でフォーマットするにはどうすればよいですか?

if (lsof returns anything) then
  echo "$folder in use"
else
  tar $folder

ありがとう

答え1

次のように答えの文字数を計算します。

#!/bin/bash

a="$(lsof +d "${folder}")"

if [[ "${#a}" -gt 0 ]] then
    echo "${folder} in use"
else
    tar "${folder}"
fi

答え2

出力の行数を計算してみることができます。列名ヘッダー行を取得し、各アクティブプロセスの追加結果行を取得します。たとえば、次のようになります。

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    1002 debian  cwd    DIR  254,4     4096 393217 .
lsof    1592 debian  cwd    DIR  254,4     4096 393217 .
lsof    1593 debian  cwd    DIR  254,4     4096 393217 .

コマンドを使用してwc -l行数を計算すると、末尾の改行も計算されます。これはwc -l、アクティブプロセスがない場合に2行の出力を評価する必要があることを意味します。したがって、次のように動作する必要があります。

if [[ $(lsof +d "${folder}" | wc -l) -gt 2 ]]; then
  echo "${folder} in use"
else
  tar "${folder}"
fi

lsof +Dまた、ディレクトリの再帰的完全な下降検索を実行するためにcall(小文字の「d」ではなく大文字の「D」)を使用したいようです。

関連情報