terminal

いやー、久しぶりにかなりハマりました。
sambaを介してLinuxと接続しているNASに対し、
ファイルを圧縮して保存するシェルスクリプトをcronで回して実行しようとしたんですが、
手動では動くのに、cronでは全然動いてくれない。

/var/log/syslogを見たら、cronはちゃんと実行されているのにー!

さて、これの原因はユーザー権限の問題でした。
sambaで接続したNASには、ユーザーの個別のidで接続の許可が振られているらしく、

root権限で回しているcronではシェルスクリプトの実行もrootで行われるので、sambaでの接続deniedになっていた

従って

sudo crontab -e

ではなく

crontab -e

でcronの設定をして上げる必要があったのでした。
おわり




terminal

あるディレクトリの中の検査データを圧縮して、同じネットワーク内のNASに保管するようにしました。

シェルスクリプトで実装したのですが、そのファイル自体はシステムのどこにでも置けるようにしたかったので、ターゲットのファイルまでは絶対パスで記述していました。

しかし、絶対パスで圧縮をかけると、ファイルの展開時に/からのツリー構造がまるっと出力されるのでした。

調べてみると、展開時に必要な部分のみを取り出すような方法もあるようなのですが、面倒くさそうだったので、以下のように実装しました。

#backup.sh
#! /bin/sh
cd /home/foo/targetDir;
zip /network/nas/$(date +"%Y%m%d_%H%M").zip ./targetFile
#$(date +"%Y%m%d_%H%M").zip は 20170804_1122.zipのように現在時をファイル名とする

何か、ルートからのツリー構造を含めないように絶対パスで圧縮指定をする方法はあるのかな?

ちなみにZIPよりtar玉にしてしまった方が、サイズは半分くらいになったのですが、Windowsからデータにアクセスする人もいるのでzip圧縮を選びました。

あとは

crontab -e

を実行して

0 19 * * * /home/foo/bin/backup.sh

で毎日19時にバックアップを実行するようにしました。

余談だが、sambaを介してのNASへのアクセスはユーザー毎の権限が定められている様子。
つまり、

sudo crontab -e

などとして、システム(root)の権限で動くcronによってシェルスクリプトを実行すると、NASにアクセスができない。
あくまで、ログイン権限のある個別ユーザーでのアクセスをする必要がある。

$ crontab -e

で実行する事が重要です。




terminal

前回の記事

lftpで自動的にcdとlcdコマンドを使って環境を合わせる方法 » WisdomTrees : http://wisdomtrees.net/?p=707

の続きです。

lftpで自動的に目標のサーバーへmirror出来るようになったので、更に発展させてローカルでの編集を監視して、即座にサーバーに反映させるような仕組みを作りました。

まず前回作ったコマンドを使ってlftp mirrorをする仕組みをシェルスクリプト化します。

#target_mirror.sh
#!/bin/sh

lftp -c 'connect XXX; cd /target/Dir/; lcd ~/Dropbox/target/Dir/; mirror -R'

そしてディレクトリの監視には、fswatchというソフトを使います。

brew install fswatch

でinstallできます。

Linux環境だと似たようなのにinotify-toolsというものがあるようです。

あとは、自分が編集しているディレクトリを監視させて、変更があった場合にはtarget_mirror.shを実行する仕組みを作ります。

fswatch -o ~/Dropbox/target/Dir | xargs -n1 -I{} target_mirror.sh

これで、ファイルを保存したタイミングで自動的にlftp mirrorコマンドが実行され、ローカルの変更が即座にリモートに反映されます。