先日作ったバックアップスクリプトをcronに登録して数日後。サーバの中身を見てみるとなんとそこには10kBほどのtarアーカイブが転がっているだけであった。
|l、{ j} /,,ィ//| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
i|:!ヾ、_ノ/ u {:}//ヘ | あ…ありのまま 今 起こった事を話すぜ!
|リ u' } ,ノ _,!V,ハ | < 『おれはバックアップを取り出そうと
fト、_{ル{,ィ'eラ , タ人. | 思ったらいつのまにかゴミファイルを解凍していた』
ヾ|宀| {´,)⌒`/ |<ヽトiゝ | 回線落ちだとかtarコマンドのオプション忘れだとか
ヽ iLレ u' | | ヾlトハ〉. | そんなチャチなもんじゃあ 断じてねえ
ハ !ニ⊇ '/:} V:::::ヽ. │ もっと恐ろしいものの片鱗を味わったぜ…
/:::丶'T'' /u' __ /:::::::/`ヽ \____________________
シェルスクリプト単体ではちゃんと動くのになんでcronで動かすとゴミファイルになるかなーと思い、早速cronからシステムから送られてくるメールをみたところ
try to create hot copy...
env: python: No such file or directory
と出てた。どうやらhot-backup.pyでコケたらしい。調べたら以下の記事にたどり着いた。
どさにっき #!/usr/bin/env
たとえば FreeBSD では、標準の /etc/crontab は
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
となっていて /usr/local/bin が含まれていない。なので、
#!/usr/bin/env ruby
というスクリプトを /etc/crontab に登録すると、FreeBSD では ruby は /usr/local/bin にあるのが標準なので、インタープリタを見つけられずにエラーになる。
BSDの場合、#!/usr/bin/env hogehoge には気をつけろって事かな。
とりあえずhot-backup.pyの1行目
#!/usr/bin/env pythonを#!/usr/local/bin/pythonに書き換え。直接インタプリタを指定するように修正した。
他にもシェルスクリプト内で export PATH=$PATH:/usr/local/bin って追記する方法がある。