cron内から出力をファイルにリダイレクトする方法は?


105

私は一日の特定の時間に実行する必要があるバックアップスクリプトを持っているので、私はcronこのタスクに使用しており、cron内からバックアップスクリプトの出力をlogfile

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

上記のcronエントリでは、両方stderr and stdoutをログファイルにリダイレクトしています。

上記のcronジョブはsyslogbackup.shファイルに従って指定されたタスクに従って正常に実行されますが、ログファイルには何も書き込みません。

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

CLIからスクリプトを実行すると、必要に応じて機能し、出力がログファイルに書き込まれます

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

だから、ファイルの出力がcron内からファイルにリダイレクトされないのはなぜですか。


回答:


158

私は問題を解決しました。2つの方法があります。

M1

リダイレクトをから&>>に変更し2>&1ます。だから今のcrontab -eようになります

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

私は信じているので、デフォルトでは上記の作品をcron使用しているshタスクを実行する代わりに、bashそう&>>でサポートされていませんsh

M2

ファイルに追加SHELL=/bin/bashしてデフォルトのシェルを変更しcrontab -eます。


14
cronのようなものshです:それは単一のプログラムを選択しません。多くの実装があります。最も一般的な実装はVixie cronです。私は(オリジナルではなく現在の)別の著者です。私はほとんどのcronデーモンがシステムを使用すると信じてshいますが、それが受け入れるかどうかは異なります&>>。一部のcronデーモン(私のような)SHELL=...では、crontabの行でcron行を実行するシェルを変更できません。あなたに合ったソリューションを見つけてくれてうれしいです。それが他の人のために働くかどうかに影響を与える可能性のある多くの変数があることを指摘する価値があると考えました。
-dubiousjim

YYYY-MM-DD_hh-mm-sec出力ファイル名に挿入して、すべてのファイル名が異なり、書き直さずに保持されるようにする方法は?
ダニエル

1
@Danijel:これは役立つはずserverfault.com/questions/117360/...を
RanRag

2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log同じこともします。
ヤニックギルアール

5

免責事項[1]。

@RanRagの回答に脚注または補遺を追加したいと思います

シェルのリダイレクト構文がに準拠していることを確認してください/bin/sh。無効なシェルリダイレクト構文を使用しよう/bin/shとすると、コマンドは失敗し、cronジョブは実行されなくなります。

構成/etc/cron.d/example1ファイルで、ユーザー以外のユーザーを指定し、rootそのユーザーのログインシェルが/bin/bash...ではない場合、/etc/cron.d/example1コマンドで/ bin / sh構文を使用する必要があります。


例えば

ユーザーは、シェルを持っている場合cshか、zshまたはksh自分のログインシェルに設定されました。構成/etc/cron.d/example1ファイルでは、コマンドは/bin/sh構文を使用する必要があります。特に、シェルのリダイレクトはすべて/bin/sh構文でなければなりません。

たとえば、でcshシェルリダイレクト構文を使用しようとすると/etc/cron.d/example1、cronジョブは実行されません。以下のためにログファイルcrondに位置は、/var/log/cronコマンドが実行されていますが、コマンドが実行される前にコマンドが構文エラーと出てエラーになることを言うものとします。

crond構文エラーのエラーメッセージはどこで発行されますか?

エラーはで報告されません/var/log/croncrond代わりに、デフォルトでを使用してエラーメッセージを出力しmailます。その/var/spool/mail/${USER}ため、エラーを確認する必要があります。

[1]

免責事項

  • この答えはsysvシステムを想定しています
  • systemd 情報は異なる場合があります
  • 特に、この情報はcentos-6ディストリビューション用に学習されたものであり、異なるsysvディストリビューションには適用されない場合があります
    • centos-6異なるディストリビューションは異なるcrond実装を持っている可能性があるため、特に言及しますcentos-6

2
あなたが持っているしたい場合/etc/cron.d/example1、コマンドは別のシェルを使用して、あなたが設定を使用することができSHELL=、あなたの中に/etc/cron.d/example1設定ファイル。
トレバーボイドスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.