私はLinuxユーザーの新人です
Crontabを実行して、データベースをvagrant userでバックアップしようとしています
* * * * * /usr/bin/mysqldump -h localhost -u root -p root mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz >/dev/null 2>&1
crontabを実行すると、フォルダーにバックアップファイルがありません(私のバックアップ/すべてに755
のアクセス許可スキームがあります)。
これは/var/log/syslog
からのエラーです
Aug 16 11:55:01 precise64 CRON[2213]: (vagrant) CMD (/usr/bin/mysqldump -h localhost -u root -p root mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz >/dev/null 2>&1)
Aug 16 11:55:01 precise64 CRON[2212]: (CRON) info (No MTA installed, discarding output)
だから私は思う
>/dev/null 2>&1
を使用してcrontabを無効にし、エラーの理由をメールで送信します。もちろん、エラーは、メーラー(sendmail、postfixなど)が実装されてアクティブになっていないことです。
>/dev/null 2>&1は、この場合はgzipのLASTコマンドにのみ適用/関連付けされるということです。したがって、mysqldumpのSTDERRに送信される何らかのタイプの出力が必要です。
あなたが望むと思うことをする正しい方法は次のとおりです:
* * * * * (command | command ) >/dev/null 2>&1
あなたは置くことができます:
MAILTO=""
crontabファイルの先頭に追加すると、メールを送信できなくなります。
crontab
コマンドを実行しているユーザーがvagrant
で、出力が書き込まれるディレクトリがroot
によって所有されており、権限755
を持っている場合、書かれていません。Sudo chown vagrant /var/backup/all
それを修正するかもしれません。
それが問題であるかどうかを確認するには、代わりに/tmp
のファイルに書き込んでみてください。
しかし、別の問題があります:次のようなコマンドmysqldump mydb | gzip > database.sql.gz >/dev/null 2>&1
はデータベースダンプをdatabase.sql.gz
および/dev/null
に書き込みます。2>&1
は、エラーメッセージを標準出力にコピーします。つまり、エラーメッセージをdatabase.sql.gz
にも書き込みます。圧縮されたデータ間のどこかにエラーメッセージテキストを書き込むため、圧縮ファイルは壊れます。問題が標準エラーストリームに書き込まれたときにのみ問題が発生するため、テスト時にうまく機能する場合があります。 stderrへの出力は単なる警告の場合がありますが、他のすべては機能します。
圧縮データベースダンプをsql.gzファイルに書き込み、エラーを/dev/null
に書き込むつもりだと思います。このためには、エラーストリームを出力ストリームにコピーしないことにより、出力ストリームを分離してください。そして、それらを次のようなファイルに向けます:
mysqldump mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz 2>/dev/null
エラーメッセージ「(MTAがインストールされていません、出力を破棄しています)」は、エラー出力を送信できないことを示すcronです。いずれにしても、エラーを/dev/null
にリダイレクトするため、最終的には問題ありません。送信するものはありません。しかし、私は現在、送信するエラーメッセージがあるのではないかと疑っています。これにより、上記の結果が確認できます。