• 締切済み

あるファイルが他プロセスによってオープンされているかどうかを確認する方法

2つのディレクトリの内容を比較し、その結果を標準出力に出力するプログラム(diffのラッパーです)を作成していますが、以下のように出力を比較対照のディレクトリ内のファイルにリダイレクトした場合、このファイルまで比較してしまいます。 $ mydiff . directory > diffresult これを防ぐため、ファイルを比較する際に、ファイルが他プロセスによってオープンされているかどうか調べ、その旨をstderrに出力するようにしたいのですが、その方法がわからず困っていますのでよろしくお願いします。

  • akym2
  • お礼率57% (4/7)

みんなの回答

  • ScF
  • ベストアンサー率0% (0/3)
回答No.4

コマンドにパスが通っていなくても 実行権限がないとは限りません コマンドをフルパス指定で実行してみてはどうでしょうか

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> ですが、このコマンドはrootのみにしか実行権限がない そうなの? > 本マシンは複数の開発者で共有しているものなので、あまり気楽にrootになるわけにはいかない 思い付く案を二つほど。 ・管理者にお願いして、fuser に実行権限をつけてもらう ・su コマンドを使って、fuser を実行する 結局 su コマンドを使う、ということは root 権限を得ることになるのだから、 「気楽に root になるわけにいかない」ということを解決しているわけには ならんですが。 ちなみに、こんな感じ。 % su root -c "/usr/sbin/fuser 対象のファイル名"

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> ファイルが他プロセスによってオープンされているかどうか調べ、その旨をstderrに出力するようにしたい 使っている OS が分からないのですが、fuser というコマンドがありませんか? こいつの出力を加工することで、望みの結果を得られるはず。

akym2
質問者

お礼

ご回答ありがとうございます。 使用しているOSはHP-UXで、/usr/sbin/fuserというコマンドはありました。 ですが、このコマンドはrootのみにしか実行権限がないため、管理者ではない私には使用できないものでした。 一応rootのパスワードも知っているため、実験したところ、プロセスIDが得られましたので、これを加工すれば何とかなることが分かりました。 ただし、本マシンは複数の開発者で共有しているものなので、あまり気楽にrootになるわけにはいかないのです。

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.1

「あるファイルが他プロセスによってオープンされているかどうかを確認する方法」 は知りませんが、 「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とかやって比較している、 と仮定しています。

関連するQ&A

  • stderrのリダイレクト方法

    標準エラー出力stderrに書き込まれた文字を、リダイレクトでファイルに流し込む方法はあるでしょうか? 意図的にできないようにしたのがstderrの気もしますが、念の為 質問させて頂きました。 どうか宜しくお願い致します。

  • ディレクトリ内の全ファイルをオープンする方法

    特定のディレクトリ内に存在する全てのファイルを順次オープン・クローズするプログラムを作成したいと思います。 例えば、特定のディレクトリに下記のファイルがあるとします。 A.txt B.txt このときにA.txtをオープンし内容を読み込みクローズし、次にB.txtを同じようにオープンし内容を読み込んでクローズするプログラムです。内容を読み込んで処理する部分は問題なく、また上記のように存在するファイルが決まっていれば何も問題はないのですが、下記の場合にはどのように存在するファイルを探せばよいのかがわかりません。 ・何ファイルあるかわからない ・存在するファイルは必ずテキスト ・ファイル名は決まっていない(perlで問題なく読み込めるファイル長) なお、特定のディレクトリに存在するファイルを順次全て読み込めればよいので、その読み込む順番にこだわりはありません。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • 拡張子を指定して、ファイルの差分を取る方法

    WindowsXPです。 フォルダを比較して、ファイル(テキストファイル)の差分をとる方法をお教えください。 ここで重要な条件は、比較する拡張子を指定できなければなりません。 例えば、拡張子が、txtのファイルのみとか、txtとcfのみなど。 サブディレクトリの中のファイルも比較できなければなりません。 どうも、このような場合には、diffというものを使うらしいのですが、 コマンドプロンプトでdiffと打っても 「'diff' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 というだけで、使えないようです。

  • ディレクトリ構成、ファイル配置の違いを確認する方法

    HPーUX11iで2つのディレクトリの サブディレクトリ構成、ファイル配置の違いを確認する方法はあるでしょうか? diffであれば、ファイルの中味まで比較してしましますし ls -lRの内容をdiffした場合、変更が有ること位しか確認できません 出来れば、何方側にサブディレクトリがふえている、ファイルが増えているを把握したいと望んでいます

  • 異なるプロセスですでに開かれているキューのオープンができません

    現在、Linux(Suse10.3)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューのオープンができません。 最初にオープンしたキューは受信専用、異なるプロセスでオープンするキューは送信専用です。 errnoを調べましたが、 EACCES("\nキューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープンする許可を持たない。")となっています。 プロセスAの第3引数についてはmode_t S_IRWXU=0x777;としていますが、この辺りの設定方法がよくわかりません。 例) <プロセスA(プロセスBより先に実行)> msqid = mq_open(   "/sample001", O_RDONLY | O_CREAT, S_IRWXU, &mqattr); cout << "msqid:" << msqid << enld; msqid:3 <プロセスB> mqd = mq_open("/sample001", O_WRONLY); cout << "msqid:" << msqid << enld; msqid:-1 ///////////////////////////////////////////////////////////// //errnoは下記の通りです。 ///////////////////////////////////////////////////////////// EACCES(キューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープ>ンする許可を持たない。) 何か心当たりはありませんでしょうか?

  • エクスプローラから開かれるWordを別プロセスにするには

    VC++2008にてプログラムを作成しています。 自作プログラム(疑似エクスプローラ)にて、 WordやExcelファイルをCreateProcessにて オープンし、WaitForSingleObjectにて ファイルが閉じられるまで待機。 ファイルが閉じられたら、終了処理という流れのシステムを 作成しています。 自作プログラムからオープンする際は、 Officeのコマンドラインオプションを用いて 別プロセスで起動するようにしていますので、 自作プログラムからWord(またはExcel)ファイルを 複数開いても、個別プロセスになるので、 各ファイルが個別に終了処理を行えるようになっています。 (なっていると思っていた) 問題は、自作プログラムからWord(a.doc)を開き、 エクスプローラから別ファイルのWord(b.doc)を開いた際、 b.docは個別にプロセスが作成されず、 a.docで作成した1プロセスにまとめられてしまうことです。 そのため、a.docを閉じても、b.docが開いている限り、 終了処理に移行しません。 APIフックにて、CreateProcessを引っ掛けてみたのですが、 エクスプローラからのファイルオープン時には 呼ばれていないようで、自作プログラム外で ファイルオープンをした際に、強制的に独自プロセスで 起動する方法が分りません。 自作プログラム起動時に限り、Word,Excelのファイルを 独自プロセスで開かせたいのですが、 解決方法はありますでしょうか? よろしくお願いします。

  • ファイルをロックしているプロセスを特定する方法

    Windows Vistaを使用しています。 あるファイルを削除しようとしたところ、  別のプログラムがこのファイルを開いているので、操作を完了できません というエラーメッセージが出ます。 どのプロセスがこのファイルを操作しているのかを知りたいのですが、どうすればよいでしょうか? おそらく、何かのプロセスがこのファイルをロックしているものと考えています。 Windowsの標準機能で解決できるならその方法を、別のフリーソフトを利用すればわかるのならその方法を教えてください。 どのプロセスかが分かれば、そのプロセスを強制終了させればファイルの削除が行えると考えています。 よろしくお願いします。

  • 標準出力と標準エラー出力を変数にセットしたいです。

    始めたばかりの初心者の為、変な質問でしたら申し訳ありません。 標準出力と標準出力を別々の変数にセットしたいのですが、そのやり方が分からず困っています。 やりたいことは、 コマンド(diffやcatなどの)実行結果の標準出力と標準エラー出力を それぞれ「任意の文字_受取パラメータの値」にセットすることをしたいです。 下記は、1回ファイルに出力して、それを読んで変数にセットするように記述したものです。 ※記述間違っていたらすみません。 ファイルに書かなくても、パイプやその他コマンドなどで出来る方法はないでしょうか? ex) test.sh 1.txt 2.txt TEST01 で実行 #!/bin/sh parm1 = $1 parm2 = $2 parm3 = $3 diff "${parm1}" "${parm2}" > test.log 2> err.log eval w_stdout_${parm3}=¥`cat test.log¥` eval w_stderr_${parm3}=¥`cat err.log¥` eval echo "stdout:¥"¥{w_stdout_${parm3}}¥"" eval echo "stderr:¥"¥{w_stderr_${parm3}}¥"" ※実行した結果 stdout:diff結果 stderr:空白 お手数ですが、何卒宜しくお願い致します。

  • コンソール出力をテキストに出力する方法(コンソール出力は残しつつ)

    【質問】  Perl内部で実行される実行ファイル(.exe)のコンソール出力(STDOUT,STDERR)をテキストファイルに出力したい。(Perlのコンソール出力も含む。) ※コンソール出力は残しつつ。 (コマンドプロンプトの)パイプとリダイレクトを使用して上手くいくかと思ったのですが、標準出力と標準エラーとでは標準エラーが先に出力されてしまい、本来出力される順番で出力されない。(標準出力はバッファにたまるため??) 何かいい方法はありませんでしょうか? 【環境】  Windows2000  Active Perl 5.8.8

    • ベストアンサー
    • Perl
  • 複数のファイルをdiffで比較するために以下のシェルを作成しましたが

    複数のファイルをdiffで比較するために以下のシェルを作成しましたが diff: 「ファイル名」の後のオペランドがありません とエラーが表示されてしまいます。 htmlディレクトリとhtml_bkディレクトリ内にある ファイルを比較する処理になります。 ======================================== find ./html -name *.html -type f | while read f do echo $f | sed 's/html/html_bk/g' $temp diff $f $temp >> diff.txt done ====================================== $tempの中身はhtml_bkと変更されていました。 原因が分かる方がいましたら教えてください。