- 締切済み
あるファイルが他プロセスによってオープンされているかどうかを確認する方法
2つのディレクトリの内容を比較し、その結果を標準出力に出力するプログラム(diffのラッパーです)を作成していますが、以下のように出力を比較対照のディレクトリ内のファイルにリダイレクトした場合、このファイルまで比較してしまいます。 $ mydiff . directory > diffresult これを防ぐため、ファイルを比較する際に、ファイルが他プロセスによってオープンされているかどうか調べ、その旨をstderrに出力するようにしたいのですが、その方法がわからず困っていますのでよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ScF
- ベストアンサー率0% (0/3)
コマンドにパスが通っていなくても 実行権限がないとは限りません コマンドをフルパス指定で実行してみてはどうでしょうか
- a-kuma
- ベストアンサー率50% (1122/2211)
> ですが、このコマンドはrootのみにしか実行権限がない そうなの? > 本マシンは複数の開発者で共有しているものなので、あまり気楽にrootになるわけにはいかない 思い付く案を二つほど。 ・管理者にお願いして、fuser に実行権限をつけてもらう ・su コマンドを使って、fuser を実行する 結局 su コマンドを使う、ということは root 権限を得ることになるのだから、 「気楽に root になるわけにいかない」ということを解決しているわけには ならんですが。 ちなみに、こんな感じ。 % su root -c "/usr/sbin/fuser 対象のファイル名"
- a-kuma
- ベストアンサー率50% (1122/2211)
> ファイルが他プロセスによってオープンされているかどうか調べ、その旨をstderrに出力するようにしたい 使っている OS が分からないのですが、fuser というコマンドがありませんか? こいつの出力を加工することで、望みの結果を得られるはず。
- Fooky
- ベストアンサー率71% (59/82)
「あるファイルが他プロセスによってオープンされているかどうかを確認する方法」 は知りませんが、 「mydiffの開始よりも後で内容が変更されたかどうかを確認する方法」 で代用できませんか? mydiffを何で書かれているか分かりませんので、私の標準シェルである cshで書くと、 # スクリプトの先頭 touch /tmp/mydiff.tmp .... if( { newer /tmp/mydiff.tmp $f1 } == 0 ) then echo $f1 is modified after mydiff was invoked. exit endif if( { newer /tmp/mydiff.tmp $f2 } == 0 ) then echo $f2 is modified after mydiff was invoked. exit endif .... # この辺で$f1と$f2を比較 rm -f /tmp/mydiff.tmp # スクリプトの末尾 上のスクリプトでは、対応するファイル名が$f1と$f2に 入っていて、diff $f1 $f2とかやって比較している、 と仮定しています。
お礼
ご回答ありがとうございます。 使用しているOSはHP-UXで、/usr/sbin/fuserというコマンドはありました。 ですが、このコマンドはrootのみにしか実行権限がないため、管理者ではない私には使用できないものでした。 一応rootのパスワードも知っているため、実験したところ、プロセスIDが得られましたので、これを加工すれば何とかなることが分かりました。 ただし、本マシンは複数の開発者で共有しているものなので、あまり気楽にrootになるわけにはいかないのです。