QA@IT

linuxのcronは自動的に実行できない原因は?

4499 PV

OS : Ubuntu 12.04

backupWhenever Gemを使って、自動バックアップしたいですが、単純にbackup perform -t my_backupを実行して、バックアップできます。
下記の書き方はできない:

0 22 * * * /bin/bash -l -c 'backup perform -t my_backup'

cat /etc/crontabで確認して、下記の配置です:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

/bin/bash/bin/shは合わない見たいです。どうすればいいですか?

  • ubuntuに限らない話としては、rubyのインストール状態(ソースから./configureしてコンパイル&インストールした, rvmやrbenvを使った(管理者権限 or not))や、crontabは誰のエントリにどうやって書いたか、といった情報が必要だと思います。 -
  • ご回答ありがとうございます。新しいサーバーで新しいユーザーを作成して、sudo権限を付きました。そして、すべての操作は新ユーザーでやりました。crontabはrootの権限が必要ですか? -

回答

まずは、何かメッセージが出ていないか確認してみてはいかがでしょうか。syslog に送るなら、logger コマンドをどうぞ。

0 22 * * * /bin/bash -l -c 'backup perform -t my_backup' 2>&1|/usr/bin/logger -t backup

logger は既定で syslog ファシリティ user.notice 宛に送るので、Ubuntu なら /var/log/syslog に記録されると思います。

編集 履歴 (0)
  • ご回答ありがとうございます。
    上記の書き方に従って、/var/log/syslogの内容は:
    init: cron main process (4155) killed by TERM signal;
    (CRON) INFO (Skipping @reboot jobs -- not system startup);
    Kernel logging (proc) stopped;
    Why?
    -
  • 私の例示は実際は一行ですが、二行に分けて書いたりしてませんか? -
  • そうですね。一行ですね。 -

単に環境変数が設定されていないだけだと思います。
cronで実行される場合は、.bashrc等で設定している環境変数は設定されていません。

あなたの環境で確実にセットされているとわかる環境変数は、crontabに書かれている

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

だけです。

確実なのは、必要な環境変数をすべてセットした後に、backupを実行するシェルスクリプトを作り、
そいつをcronで実行しましょう。

しかし、タイトルを見ると、そもそもwhenever使うつもりだったんですよね?
なんでwheneverから実行せずに、cronから直接backup実行してるの?

編集 履歴 (0)
  • 1./etc/crontabにまた4行配置があります。2.wheneverはcronファイルを作成だけで、生成したものは"0 22 * * * ..."それですね。 -

もしVixie Cronをお使いで、かつ実行できないのがcrontabの最終行であれば、crontabの末尾に空行を加えると解決するかもしれません。

私は玄箱T4(Debian Lenny)でcrontabの内容が実行されない問題に陥りましたが、上記条件に合致したためcrontabの末尾に空行を加えたところ実行されるようになりました。

なお、原因や対策については http://manpages.ubuntu.com/manpages/precise/en/man1/crontab.1.html のDIAGNOSTICSの2段落目、または http://man.cx/crontab(1)/ja のバグの欄に書かれています。

編集 履歴 (0)
  • ご回答ありがとうございます。試してみました。同じです。「PATH」の問題と思います。 -

shameless plugで恐縮ですが、

http://dumper.io

というサービスがあります。MySQL, PostgreSQL, MongoDB, Redisの自動バックアップに対応しています。

個人的に色々なサービスを作ってきているのですが、毎回バックアップのためのcronの設定がどうにも面倒くさくて、それ自体をサービス化してしまいました。Railsの内部から動作するgemもあります。

cronのデバッグとしては、こける可能性のあるステップはたくさんあるので、/etc/rsyslog.confなどを編集して/var/log/cron.logへのロギングを有効化するのが最初の一歩と思います。

編集 履歴 (0)
  • ご紹介ありがとうございます。試してみました。
    production環境だけ使いたいですから、この書き方だと、`Rails.env.production? && dumper_enabled_host?`、このエラーです:`undefined method `dumper_enabled_host?' for main:Object`
    -
  • dumper_enabled_host?というのはサンプルで、環境に合わせてユーザが定義するもののイメージです。必要なければRails.env.production?だけでいいと思います。(が、まずはテストのためdevelopmentでも有効にした状態で試されるのがよいと思います) -
  • 分かりました。ありがとうございます。このツールがすごいですね! -
  • :) -
ウォッチ

この質問への回答やコメントをメールでお知らせします。