スクリプトで、ファイルが現在別のプロセスによって書き込まれているかどうかをどのように判断できますか?

スクリプトで、ファイルが現在別のプロセスによって書き込まれているかどうかをどのように判断できますか?

私は bash スクリプトの初心者なので、間違ったことを言っているかもしれませんが、現在の状況は次のとおりです。

スクリプトでは、ソフィス; を変換するodtpdf

のようだソフィススクリプトのプロセスから切り離されて、独自の処理を実行します。 まあ、問題ありません。GUI アプリはそういう傾向があります...

しかし、新しいpdf完全に書き終えたので、次のステップではその新しいpdf

(私の知る限り) スクリプトが開始される前にすでに実行中のプロセスであった可能性があるため、soffice のプロセス ID を利用することはできません。例:ソフィス別の無関係なドキュメント/プレゼンテーション/スプレッドシートの通常の GUI アクティビティのためにすでに開かれている可能性があります。

私にとって問題の核心は、私が先に進む前に、新しいpdf確定する必要があります...

ファイルがいつ更新されたかを判断する方法はありますか?もはや「書き込み」モードで別のプロセスに開かれますか? ...

答え1

lsof | grep /absolute/path/to/file.txtファイルが開いているかどうかを確認するために使用できます。ファイルが開いている場合、このコマンドはステータス 0 を返し、そうでない場合は 256 (1) を返します。

通常、一度に多数のファイルが開かれているため、このコマンドには数秒かかることに注意してください。

またlsof -c gedit、たとえば を使用して、gedit がどのファイルを開いたかを確認することもできます。出力を 1 つのプロセスに制限すると、実行時間が実質的にゼロになります。

待機するためのスクリプトは次のとおりです。

#!/bin/bash

while :
do
    if ! [[ `lsof -c python3.2 | grep test.py` ]]
    then
        break
    fi
    sleep 0.5
done
echo "done"

これは、プロセス 'pyhton3.2' がファイル 'test.py' を開いている間に実行されます。ファイルが閉じられるとすぐに、'echo done' に進み、終了します。

ループが CPU をそれほど占有しないように、そこに 'sleep 0.5' を入れました。そうしないと、CPU が 100% 使用されます。

ボーナス odt を pdf に変換する簡単な方法があるようです:

この素晴らしいヒントを提供してくれた OOo フォーラムの scls19fr に感謝します。OpenOffice Writer ファイルをコマンドラインから PDF に変換できます。unoconvunoconv -f pdf input.odtを取得するには、 sudo apt-get install unoconvターミナルで実行するだけです。 (rhyshale.wordpress.com の rhyshale)

関連情報