ファイルが使用中でない場合、または他のプログラムで作成された場合にのみファイルを読み取るには、シェルスクリプトを作成する必要がある問題に直面しています。 lsof は使用できません。これは、スクリプトが非常に基本的なシェル機能を使用してQNXを実行する組み込みハードウェアで実行されるため、サードパーティのツールとライブラリがないためです。
答え1
今答えを見つけたと思います。スクリプトの一部として作成します。
#!/bin/bash
# Script to prevent writing to a certain file.
# This should be adjusted to your needs, replace all /paths/ and <xxxxxxx>
# with your true paths and filenames.
chmod +r /path_to_file/<filename>
<now_do_what_you_want_with_that_file, command(s) here>
for a in {120..1}; do echo -n "$a..." && sleep 1; done # In 120 seconds <filename> will be writable.
chmod -r /path_to_file/<filename>
ファイルを別の場所にコピーするスクリプトを作成し、開封しても使用しなかったコピーをお読みください。、完了後X秒後に削除してください。
必要に応じてこの操作を繰り返すことができます。
答え2
ファイルが現在作成されているかどうかわからず、プログラムがそのファイルを使用しているかどうかを確認する機会がない場合は、ctime、mtime、atimeを確認することをお勧めします。ほとんどのシステムで利用可能な「stat」コマンドを使用してこれを実行できます。 3~4回程度確認して差が無い場合はご記入ください。 atime(接続時間)は確認する限り継続して変更されることをご参考ください!
別のアイデアは、ファイルのコピーを作成してそのコピーを使用することです。作業が完了したら、修正を元のものと比較し、他の変更がない場合は交換します。また、「diff」と「patch」を試してみることもできます。これを行う前にバックアップを実行することをお勧めします!
答え3
免責事項:私はQNXについてよく知らず、組み込みデバイスについてもわかりません。
あなたが尋ねるのは基本的にファイルロックに関するものです。プロセスは、一部の操作を実行するためにロックされたファイルの共有ロック(読み取りロック)を取得しようとします。他のプロセスが同じロックに対して排他的ロック(書き込みロック)を保持している場合、最初のプロセスは排他的ロックが解除されるまでブロックされます。逆に、他のプロセスがそれを共有するアクティブな共有/排他ロックを持っていない場合にのみ、プロセスは排他ロックを獲得できます。
太陽必須カーネルでサポートする必要があるファイルロック。安定して動作するシェルスクリプトを使用してこれを行うUnixシステムはほとんどありません(Linuxの場合この記事2007年から始まり、この問題StackOverflowから)。
探すロックは、次のプログラムを介してユーザースペースで実装されますflock
。このタイプのファイルロックには、次のプロセスが必要です。協力これは、ロックされたファイルへの読み取りまたは書き込みアクセスを明示的に要求する必要があることを意味します。同時に、非協調プロセスは依然としてロック機構を無視することができる。
質問」群れがうまくいかないようですflock
「は、シェルで推奨ロックを使用することに関するものです。
また見なさい:セマフォ/ロックとして使用できるUnixコマンドは何ですか?mkdir
(これはアトミックな作業であるため、一部の回答でこの目的で使用する推奨ロックにも関連しています。)