プロが教える店舗&オフィスのセキュリティ対策術

FTPで書き込み中のファイルがあるとします。そのファイルが、書き込み中なのか、それとも、書き込みが完了したのかを、知りたいのですが、良い方法はありますでしょうか。書き込みファイル名はあらかじめ、わかっています。(書き込み中に読んだ場合、最後まで読み切ることが出来ないために書き込み完了迄待ちます)当方で、調査した限りでは、ファイル名を指定して、そのファイルが、他プロセスによってオープンされているか否かを知るシステムコールは存在しませんでした。OSは、sun solaris10を使用の予定ですが、UNIX系(linux含む)で実現可能であれば、かまいません。

A 回答 (13件中11~13件)

もう一案。


手元にcygwinしかないので確認できないのですが。
まず実験として、
(1)pfilesコマンドでFTPデーモンのファイルディスクリプタ一覧を得る。
(2)ファイルディスクリプタ一覧のinode番号で、目的とするファイルが使用中か確認する。目的のファイルのinode番号はstatで得ておく。
なんてのはどうでしょうか?

pfilesコマンド自体の機能もソース見ればわかると思うので、プログラム上に吸収可能だと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。いくつかの理由があって、たぶん、この方法を採用することは、無いとおもいますが、デーモンが「特定のファイルを書き込み中」か否かを判断する方法としては、最もこの案が、正解に近いと思います。又、pfilesコマンドの存在について判っただけでも収穫でした。ありがとうございました。

お礼日時:2007/09/08 14:22

> 運用上、上記の短所が問題にならなければ、採用の候補…



あはは。ありがとうございます(笑)まぁ、人間、自分のアイデアを大事にしたいというのが普通ですから^^ ここは、議論の場ではないようですが、色々とアイデアを出し合うのは楽しいですね。ではでは、お邪魔しました^^

====
// ディレクトリから fname にファイル名を得る

char *p = strrchr(fname, '_');
if (p == NULL) return; // 約束違反のファイル名
char *q = strrchr(fname, '.');
if (q == NULL || q < p) return; // 約束違反のファイル名
*q = '\0';
size_t fsiz = atol(p + 1);
if (fsiz == 0) return; // サイズ0はおかしい(笑)

*q = '.';
stat(fname, &statbuf);
if (statbuf.st_size != fsiz) return; // 書き込み中?

===
# .netrc が適当に設定されているとして

fname=`basename $pathname`
fsiz=`ls -l $file | awk '{print $5}'`
remotefile=`echo $fname | sed -e "s/\\([^.]*\\)\\.\\([^.]*\\)/\\1_$fsiz\\2/"`
ftp $remotehost <<EOF
bin
put $pathname $remotefile
bye
EOF
===
とか、やればいいんじゃないですか?^^ 修正時刻のチェックは、エラー処理に活用できますね(現在時刻と最終修正時刻の差があまりに大きいにもかかわらず、サイズが異なる場合など)。
    • good
    • 1
この回答へのお礼

ソースまで提示していただき、ありがとうございます。mikaemi様の案が採用となった暁には、是非このソースも参考にさせていただきます。

お礼日時:2007/09/08 13:30

xferlog とか サーバーログの確認では、だめなのでしょうか?



参考URL:http://www.linux.or.jp/JM/html/wu-ftpd/man5/xfer …
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ちょっと、期待していた回答ではないのですが「サーバーログの確認」ということで、参考になりました。

お礼日時:2007/09/08 14:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A