Cronスクリプトでシステムの日付/時刻を使用する


37

サーバーにある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でシステムの日付や時刻を何らかの変数として使用できる方法はありますか?そうでない場合、同じことを達成するための提案は何ですか?

回答:


45

次のようなものを試すことができます(以下のglenn jackmannのメモにあるように、すべての%キャラクターをエスケープする必要があります)。

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

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

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

また、ISO8601の日付形式(yyyy-mm-dd、これは%F)を使用して、レキシカルに並べ替えるときにファイル名を日付順に並べることをお勧めします。


23
datecronファイルの内部には注意する必要があります。一部のcron(すべて?)%はコマンドの終わりとして扱われます。(だから$()問題ではなかった)。すべてのパーセント記号をエスケープ... touch "/tmp/$(date +\%Y-\%m-\%d)"する必要があります
:(

2
glenn jackmanは正しい:上記のcrontabエントリの「%」文字をエスケープします。RHEL 5.0のcrontabエントリは次のようになります。5011 * * * touch "/tmp/backup.$(date + \%Y-\%m-\%d).sql"
Bruce Ediger

サブシェルの使用は環境変数では機能しないことに注意してください。だから、DATE=$( date -I )その後、使用して${DATE}リテラル使用して結果を後で$( date -I )ジョブのコマンドラインでを。
クリストファーシュルツ

1
%OpenSuse 42でもエスケープが必要なようです。
kgadek

7

使用できるはずdateです。または詳細を
入力します。info dateman date

次のようなものが適している場合があります(日付形式をニーズに合わせて変更します)

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

繰り返しますが、%cron内のすべての文字をエスケープするように注意してください。
グレンジャックマン

@glenn:なるほど。辞書順については、OPの日付形式と一致しました。個人的には、ISO形式が好きです。
asoundmove


1

私が使用した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ジョブをこれに向けて、夜間または任意の実行を実行します。


これは魅力のように機能します。しかし、私はここで何が起こっているのかよくわかりません。バックティックにより、他のプログラムまたは何かの出力を含めることができますか?フォーマット(+%Fなど)はどうですか?
エアロクロス

1
ええ、バックティックはコマンド置換を実行します。出力はコマンド自体に置換されます。参照してください3.4.5 ここでは、より包括的なデータのための修飾子のリストですリンク

ああ、すごい、それは素晴らしいリソースです。常に学習を続けることは素晴らしいことです。リンクありがとうございました!
エアロクロス

0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.