การใช้วันที่ / เวลาของระบบใน Cron Script


37

ฉันกำลังตั้งค่า Cronjob ที่จะสำรองฐานข้อมูล MySQL ที่ฉันมีในเซิร์ฟเวอร์ของฉัน แต่ฉันไม่ต้องการให้มันเขียนทับไฟล์เดียวกันซ้ำแล้วซ้ำอีก แต่ฉันต้องการให้มีชุดข้อมูลสำรองมากมายให้เลือกทำโดยอัตโนมัติ ตัวอย่างเช่น:

## 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 ของคุณ

โดยไม่ต้องหลบหนี%"cron" บน Redhat Enterprise Linux 5.0 (ฉันคิด) )เก็บไว้ให้ฉันข้อผิดพลาดเกี่ยวกับการไม่พบการจับคู่ นี่เป็นเพราะทุกอย่างหลังจาก unescaped %ถูกส่งไปยังอินพุตมาตรฐานของคำสั่ง

ฉันจะใช้คำแนะนำเพื่อใช้รูปแบบวันที่ ISO8601 (yyyy-mm-dd ซึ่งก็คือ%F) เพื่อสร้างชื่อไฟล์เรียงตามวันที่เมื่อเรียงลำดับตามปกติ


23
จะต้องระมัดระวังด้วยdateภายใน cronfile: crons บางส่วน (ทั้งหมด?) ถือว่า%เป็นจุดสิ้นสุดของคำสั่ง (ดังนั้นจึง$()ไม่ใช่ปัญหา) คุณต้องหลบหนีสัญญาณร้อยละทั้งหมด: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(ดีกว่าที่จะใช้รูปแบบวันที่เรียงตามพจนานุกรม)
Glenn jackman

2
glenn jackman ถูกต้อง: การหลีกเลี่ยงอักขระ '%' ในรายการ crontab ด้านบนใช้งานได้ รายการ RHEL 5.0 crontab มีลักษณะเช่นนี้: 50 11 * * * touch "/tmp/backup.$(date + \% Y - \% m - \% m - \% d) .sql"
Bruce Ediger

เป็นที่น่าสังเกตว่าการใช้ subshell ไม่ทำงานในตัวแปรสภาพแวดล้อม ดังนั้นDATE=$( date -I )แล้วใช้ใน${DATE}ภายหลังในผลลัพธ์ในการใช้ตัวอักษร$( date -I )ในบรรทัดคำสั่งของงาน
Christopher Schultz

1
ดูเหมือนว่าการหลบหนีของ%จำเป็นสำหรับ OpenSuse 42 เช่นกัน
kgadek

7

dateคุณควรจะสามารถที่จะใช้
พิมพ์info dateหรือman dateเพื่อดูรายละเอียด

สิ่งต่อไปนี้อาจเหมาะกับคุณ (เปลี่ยนรูปแบบวันที่ตามความต้องการของคุณ)

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

อีกครั้งระวังที่จะหลบหนี%ตัวอักษรทั้งหมดที่อยู่ภายใน cron
เกล็นแจ็คแมน

@glenn: อ๊ะแน่นอน ตามคำศัพท์เฉพาะทางฉันเพิ่งจับคู่รูปแบบวันที่ของ OP ส่วนตัวแล้วฉันชอบรูปแบบ ISO เช่นเดียวกับคุณ
asoundmove


1

นี่คือสคริปต์ทุบตีที่ฉันใช้:

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

ไฟล์มีลักษณะดังนี้:

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

ชี้งาน cron ที่นี่เพื่อให้ทำงานทุกคืนหรืออะไรก็ตามที่คุณต้องการ


งานนี้มีเสน่ห์เหมือนกัน แม้ว่าฉันจะไม่เข้าใจสิ่งที่เกิดขึ้นที่นี่ Backticks อนุญาตให้มีการรวมเอาท์พุทของโปรแกรมอื่นหรือบางสิ่งบางอย่างหรือไม่? การจัดรูปแบบเป็นอย่างไร (เช่น +% F และเช่นนั้น)
AeroCross

1
ใช่ backticks ทำการทดแทนคำสั่งที่มีการทดแทนเอาท์พุทสำหรับคำสั่งของตัวเอง อ้างถึงส่วน 3.4.5 นี่คือรายการตัวดัดแปลงที่ครอบคลุมมากขึ้นสำหรับดาต้าลิงค์

โอ้ว้าวนั่นเป็นทรัพยากรที่น่าอัศจรรย์ เป็นเรื่องดีที่จะเรียนรู้อยู่เสมอ ขอบคุณมากสำหรับลิงค์!
AeroCross

0

เขียนสคริปต์ wrapper ขนาดเล็กที่ใช้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.