- PR -

ファイルを消すスクリプト

投稿者投稿内容
ドラミ
常連さん
会議室デビュー日: 2005/09/27
投稿数: 25
投稿日時: 2007-11-14 14:57
いつもお世話になっております
掲題の件についてお尋ねさせていただきます。

ある特定のファイルが作成されたら、即削除するようなスクリプトを作りたいのですが、なにかよい方法はありますでしょうか。
方法や手順は問いませんので、ご教授のほど宜しくお願いいたします。

■やりたいこと
/home/(hoge)/Maildir/courierpop3dsize のcourierpop3dsizeが作成されたら即時に削除したい。(hoge)は、一意で各ユーザーのMaildir以下に生成されます。

■背景
OutLookで、「サーバーに残す」の設定している場合、当該ファイルが悪さをしてたまに同じメールが2個届いてしまいます。

■構成
・RedHatES4(Update5)

awkがいいのか、shellがいいのか、perlがいいのか、いろいろ悩んでましたがラチがあかないのでご意見をお聞かせください。宜しくお願いします。
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2007-11-14 15:23
こんなスクリプトをcronで定期実行する。
コード:
#!/bin/sh

find /home -type f -name courierpop3dsize | xargs rm

exit



こっちの方が処理がやや早いかも。
コード:
#!/bin/sh

ls /home | {
	while read _dir
	do
		rm -f /home/$_dir/Maildir/courierpop3dsize
	done
}

exit


ドラミ
常連さん
会議室デビュー日: 2005/09/27
投稿数: 25
投稿日時: 2007-11-14 15:45
温州蜜柑さん、返信ありがとうございます。
スクリプトまで丁寧に記述いただき、ありがとうございます。

cronによる自動実行でのやり方でも問題ないかと思いますが、もし可能でしたらディレクトリを常時監視していてファイルが作成されると即時削除させたいと考えています。

いただいたシェルを常駐させたりするのは可能でしょうか?


[ メッセージ編集済み 編集者: ドラミ 編集日時 2007-11-14 15:48 ]
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-11-14 16:00
プログラムを組んでも良いのなら、fcntl(2) の F_NOTIFY の DN_CREATE を登録しておいて、通知が来たら stat(2) して存在してたら削除すればよいんじゃないでしょうか。
みなと
大ベテラン
会議室デビュー日: 2002/06/14
投稿数: 202
お住まい・勤務地: Q州地方の日本海側
投稿日時: 2007-11-14 16:04
こんにちは。

exitしないで無限ループにしてしまえば常駐しますけど
それに付随して発生するCPU負荷やメモリ消費
ディスクIO負荷なんかも考慮しないといけないかもしれませんね。
#たぶんたいしたことないと思いますが。

試せばいいんじゃないですかネ。
かなもの
ベテラン
会議室デビュー日: 2006/08/07
投稿数: 62
投稿日時: 2007-11-14 22:04
素人ながら書いてみます。

ファイルの作成を許したくないのか、
ファイルを置きたいけど、容量を増やしたくないのか
どちらでしょうか?

許したくない場合は、パーミッションの設定をすべきだと思います。
あらかじめファイル名が決まっているのならば、
/dev/nullへのシンボリックをおいて、書き込むデータを全てnullに捨てる方法もあるかと思います。

ln -s /dev/null /home/(hoge)/Maildir/courierpop3dsize
ドラミ
常連さん
会議室デビュー日: 2005/09/27
投稿数: 25
投稿日時: 2007-11-15 11:35
皆様、返信ありがとうございます!

> スフレさん
プログラムを書いたことがない私では理解不能でした。すみません。
しかしfcntl(2)でのやり方は非常に興味のある内容なので、時間のあるときにでもため
してみます。

> みなとさん
はい、試してみました。
温州蜜柑さんに教えていただいた次のコードを少し修正して、1分毎に実行するようループさせてみました。

コード:
--------------------------------------------------------------------------------

#!/bin/sh

ls /home | {
while : read _dir
do
rm -f /home/$_dir/Maildir/courierpop3dsize
sleep 60
done
}

exit


--------------------------------------------------------------------------------
この時に問題になるのが、/home/(hoge)/部分が4000ディレクトリあり、スクリプトが1分で終了しないことがわかりました。(平均2.5分かかってしまいました)

しかたのないことかもしれませんが、1分以上経過してしまうと、メールのヘビーユーザーがメールを多重受信してしまう恐れがあり、もう少し軽くできないものかと考えています。

> かなものさん
ファイルの作成は許したくないです。

ということで、パーミッションの設定をしてみました。
chown root.root /home/(hoge)/Maildir/courierpop3dsize
とやりましたが、メールを受信すると勝手に所有者が本人に替わってしまいます。
おそらくPOPサーバがroot権限で書き換えてしまっていると考えられます。

ln -s /dev/null /home/(hoge)/Maildir/courierpop3dsize
→こちらについても試してみましたが、メールを受信するとシンボリックが削除さ
れて、元のファイルに書き換えられてしまいます。

しばらくは上記コードを3分間隔で実行させていただき、また状況を報告させてい
ただきます。

いろいろとありがとうございます。
未記入(仮)
会議室デビュー日: 2007/08/30
投稿数: 4
投稿日時: 2007-11-15 14:18
rm -f /home/*/Maildir/courierpop3dsize
って、できませんでしたっけ?

あと、軽くとおっしゃってますが、処理を早くするのであれば、処理を分散してみては?

rm -f /home/[a-z]*/Maildir/courierpop3dsize&
rm -f /home/[A-Z]*/Maildir/courierpop3dsize&
rm -f /home/[0-9]*/Maildir/courierpop3dsize&
(注意:未検証)
(問題:このまま実装すると、非同期プロセス(子プロセス)になってしまうので、1分間起動で非同期プロセスが完了せずに、次のプロセスが走ってしまいますが...)

スキルアップ/キャリアアップ(JOB@IT)