web-dev-qa-db-ja.com

cronスクリプトでのシステム日付/時刻の使用

サーバーにあるMySQLデータベースをバックアップするCronjobを設定していますが、同じファイルを何度も上書きし続けたくありません。代わりに、自動的に実行される一連のバックアップから選択する必要があります。例えば:

## Cronjob, run May 21st, 2011:
mysqldump -u username -ppasword database > /path/to/file/21-03-2011.sql

## SAME Conjob, run May 28th, 2011:
mysqldump -u username -ppasword database > /path/to/file/28-03-2011.sql

等々。

私のCronjobでシステムの日付や時刻をある種の変数として使用する方法はありますか?そうでない場合、同じことを達成するための提案は何ですか?

38
AeroCross

あなたはこのようなものを試すことができます(以下のグレン・ジャックマンが注記するように、すべての%文字をエスケープする必要があります):

15 11 * * * touch "/tmp/$(date +\%d-\%m-\%Y).sql"

特定のcronがcrontabからコマンドをスクリプトとして実行するかどうか、または日付を文字列として計算するスクリプトを作成してmysqldumpコマンドを実行する必要があるかどうかを確認します。

%をエスケープせずに、Redhat Enterprise Linux 5.0(と思います)の「cron」で、一致する)が見つからないというエラーが表示され続けました。これは、エスケープされていない%の後のすべてがコマンドの標準入力に送信されるためです。

また、ISO8601の日付形式(yyyy-mm-dd、つまり%F)を使用して、ファイル名を語彙的に並べ替えたときに日付順に並べることをお勧めします。

46
Bruce Ediger

dateを使用できるはずです。
タイプinfo dateまたはman date 詳細については。

次のようなものが適している場合があります(必要に応じて日付形式を変更してください)。

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension
7
asoundmove

このようなコマンドを適切に実行するには、エスケープ%する必要があります。その後、期待どおりに実行されます。

参照: http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/

4
Édouard Lopez

これが私が使ったbashスクリプトです:

#!/bin/bash
mysqldump -u user1 -p DatabaseName | gzip > BackupFolder/backup`date +%F_%T`.sql.gz

ファイルは次のようになります。

backup2011-03-02_15:16:46.sql.gz

これをcronジョブに向けて、毎晩実行したり、好きなように実行したりします。

1
user5319

dateコマンドを使用してバックアップコマンドを呼び出す小さなラッパースクリプトを記述します。

#!/bin/bash
NOW=`/bin/date +"%m%d%Y-%H%M%S"`
if [[ "$?" != "0" ]]; then
 NOW="UNKNOWN_DATE"
 fi
mysqldump -u username -ppassword database > /path/to/file/$NOW.sql
if [[ "$?" != "0" ]]; then
 echo "$0: backup failed with error code $?"
 fi
0
LawrenceC