プロセスがファイルの書き込みを完了した時点をどうやって知ることができますか?

プロセスがファイルの書き込みを完了した時点をどうやって知ることができますか?

シェルで作成されたプロセスがあります。バックグラウンドプロセスとして実行され、データベースを.csvファイルにエクスポートします/tmp

バックグラウンドプロセスが完了(終了/終了)されているのか、CSVファイルのロックが閉じられているのか、どうすればわかりますか?ファイルの作成後に別のホストにFTPを送信する予定ですが、ファイル転送を開始する前にファイル全体が必要です。

答え1

Linuxでは、プログラムがファイルに書き込んでいる間でもファイルはロックされません(Windowsとは異なり)。

プロセスが完了したことを確認するには、次のようにします。

while [[ 1 ]]; do
  pgrep dbprocess &>/dev/null

  if [[ $? -eq 0 ]]; then
    echo still running
  else
    echo finished
    # start ftp transfer
  fi
  sleep 2
done

プロセスでファイルが開いていることを確認するには、次のようにします。

  • lsof <file>開いているプロセスが一覧表示されます。<file>

  • ls -l /proc/$(pgrep db-process)/fdプロセスによって開かれたファイル記述子のリストdb-process

答え2

wait組み込みシェルを使用してこれを行うことができます。

組み込みwait関数は単にシェルを一時停止し、バックグラウンド操作が完了するのを待ちます。これを特定のジョブに渡して待つか、すべてのジョブを待つことができます。

たとえば、

echo $(date): starting
sleep 5 &
echo $(date): do something else
wait
echo $(date): background job finished

結果:

Thu Sep 25 12:06:48 EDT 2014: starting
Thu Sep 25 12:06:48 EDT 2014: do something else
Thu Sep 25 12:06:53 EDT 2014: background job finished

関連情報