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


21

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

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

sofficeは、スクリプトのプロセスから切り離され、独自のことをするためにさまようように見えます。GUIアプリはそうする傾向があります...

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

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

私にとって問題の核心は、先に進む前に、新しいpdfの作成を完了しなければならないということです...

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

回答:


25

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を使用します。

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

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


untilループでこれをラップすると、取り引きができます。
ニックパスクッチ

やった :-)私はそれがひどいスタイルではないことを願っています-ベストプラクティスを読み上げることに悩まされていません。とにかくうまく機能します。
ステファノパラッツォ

ステファノに感謝します...はい、うまくいきます...それで、それは良い、そして正しい答えです。1つの補足として、それは、sofficeで起こっていることは、私が思った通りではないことを強調しました。が作成され、最終ファイルは(おそらく/おそらく)完了時に名前が変更されます...だから私はそれを見ています...その場合、その* existanceを待つ必要があるかもしれません... ...そしてunoconvのリンクに感謝します..私はそれを調べます..(全体的に、.pdfをページごとに複数の..jpegに変換しています)
-Peter.O

@ fred.bearがファイルが存在するまで待機するには、if文を次のように置き換えますif [ -f test.odf ]。(bashスクリプトはときどき不可解なことがあります...)
ステファノパラッツォ

6
lsof -- /path/to/file代わりにgrep'ing
RubyTuesdayDONO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.