web-dev-qa-db-ja.com

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

私はbashスクリプトを始めたばかりなので、間違ったツリーを探しているかもしれませんが、現在の状況は次のとおりです。

スクリプトでは、soffice;を開始します。 odtpdfに変換するには

sofficeは、スクリプトのプロセスから自分自身を切り離し、自分のことを実行するためにさまようようです。 GUIアプリはそうする傾向があります...

ただし、新しいpdfが完全に書き込まれるまで待つ必要があります。次のステップでは、その新しいpdfを処理する必要があります。

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

私にとって問題の核心は、先に進む前に、新しいpdfの記述を確定しなければならないということです...

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

19
Peter.O

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

通常、多くのファイルが常に開いているため、このコマンドには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」を入れました。それ以外の場合は、100%CPUを使用します。

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

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

23
Stefano Palazzo