何がいいってファイルがアップロードされたことを契機に
コマンドを実行することができる機能があることです。
常時ではないもののネットワークカメラから静止画をftpサーバに送る
ようなことをやっており、
最新の静止画のみが見られるようにしているのですが、
pure-ftpdの機能を使えばアップデートしたファイルを
バックアップディレクトリにファイル名を変えて保存し、
あとでまとめて見るようなことが、
カメラ側の機能に頼らずにできます。
ということでUbuntu 14.04のVPS環境でやってみることに。
最初に今動作しているproftpdを停止します。
# /etc/init.d/proftpd stop # update-rc.d -f proftpd removeただこれは必要ないかもしれません。
と言うのは
# apt-get install pure-ftpdでpure-ftpdをインストールする時にproftpdは
自動的にアンインストールされるようだからです。
なお設定ファイルはそのまま保持されるので、
# apt-get install proftpdを実行すればpure-ftpdが消えて元の状態に戻ります。
で、設定ですがとりあえず
# echo no > /etc/pure-ftpd/conf/PAMAuthentication # echo yes > /etc/pure-ftpd/conf/UnixAuthentication # echo yes > /etc/pure-ftpd/conf/ChrootEveryone # echo yes > /etc/pure-ftpd/conf/CallUploadScriptな感じにしてみました。
# /etc/init.d/pure-ftpd stop # /etc/init.d/pure-ftpd startで再起動すれば特に問題なく動作しているようです。
しかしトラブルはここから。
どうやらpure-uploadscriptコマンドでアップロード時に
行いたい処理を指定すればよいようなのですが、
うまく行かない…
しょうがないので起動スクリプト"/etc/init.d/pure-ftpd"を
眺めていたのですが、pure-uploadscriptはpure-ftpdを
スタンドアロンで起動しないと動かないのに、
このスクリプトではinetd経由での起動しか
サポートしていないように見えます。どういうこと?
起動スクリプトを全面的に書き換えて対応しようとするも、
そっちがその気ならこっちにも考えがあるとばかりに
慣れたproftpdにinotifywaitを組み合わせるよう変更することに。
まずは
# apt-get install inotify-toolsでファイル(ディレクトリ)監視ツールをインストールします。
次いで、特定ファイルの"<監視コマンド>"を
適当なディレクトリに以下の内容で作成します。
#!/bin/bash while : do event=`inotifywait <画像ファイル(フルパス)> -e close_write --format '%T' --timefmt '%Y%m%d%H%M%S' 2> /dev/null` mkdir -p <画像ファイルのバックアップ先ディレクトリ(フルパス)> cp -f <画像ファイル(フルパス)> <画像ファイルのバックアップ先ディレクトリ(フルパス)>/$event.jpg doneこの<監視コマンド>に実行権限を
# chmod 755 <監視コマンド(フルパス)>で与えておきます。
これを実行中に、<画像ファイル(フルパス)>を新しいファイルに
上書きすると、その画像ファイルが
<画像ファイルのバックアップ先ディレクトリ>に
アップロード時刻をファイル名としたファイルとしてコピーされます。
なおコンソールにログインして
# nohup <監視コマンド(フルパス)> &を実行しログアウトすれば、バックグラウンドで実行を維持できます。
停止させるのは
# pkill <監視コマンド>だけでいいと言いたいところですが、
残った子プロセスを停止させるために
$ pkill inotifywaitも必要です。ちょっと面倒です。
デーモンとして自動起動させたければ、
"/etc/init.d/skeleton"をテンプレートにして
起動スクリプトを作成し、
update-rc.dで自動起動するようにしておけばいいでしょう。
ですが私は面倒なのでやっていません。
VPSは2年ぐらい立ち上げっぱなしなので、
そんなに気にしてません。
0 件のコメント:
コメントを投稿