एक क्रोन स्क्रिप्ट में सिस्टम दिनांक / समय का उपयोग करना


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

और इसी तरह।

क्या मेरे क्रोनजॉब में किसी प्रकार के चर के रूप में सिस्टम दिनांक और / या समय का उपयोग करने का कोई तरीका है? यदि नहीं, तो इसे पूरा करने के लिए आपके सुझाव क्या हैं?

जवाबों:


45

आप कुछ इस तरह की कोशिश कर सकते हैं (नीचे ग्लेन जैकमैन नोट के रूप में, आपको सभी %पात्रों से बचना होगा ):

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

यह देखने के लिए कि क्या आपका विशेष क्रोन क्रॉटाब के बाहर कमांड को एक स्क्रिप्ट के रूप में और स्वयं को चलाएगा, या यदि आपको एक स्क्रिप्ट लिखने की आवश्यकता है जो तारीख को एक स्ट्रिंग के रूप में बताती है, और फिर आपका mysqldump कमांड चलाता है।

%रेडहैट एंटरप्राइज लिनक्स 5.0 (मुझे लगता है) पर "क्रोन" से बचने के बिना , मुझे मिलान न करने के बारे में त्रुटियां दे रहा था )। इसका कारण यह है कि एक unescaped के बाद सब कुछ %कमांड के मानक इनपुट पर भेजा जाता है।

मैं ISO8601 तिथि प्रारूप (yyyy-mm-dd, जो है %F) का उपयोग करने की सिफारिश भी लेगा जब फ़ाइल नाम क्रमबद्ध रूप से क्रमबद्ध किए गए।


23
dateएक क्रोनफाइल के अंदर सावधान रहना होगा: कुछ क्रोन (सभी?) %कमांड के अंत के रूप में मानते हैं । (इसलिए $()समस्या नहीं थी)। आपको सभी प्रतिशत संकेतों से बचना होगा: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(एक तारीख प्रारूप का उपयोग करने के लिए जो कि
शाब्दिक रूप से

2
ग्लेन जैकमैन सही है: ऊपर दिए गए क्रॉस्टैब प्रविष्टि में '%' वर्णों से बचकर। RHEL 5.0 crontab प्रविष्टि इस तरह दिखती है: 50 11 * * * "टच" /tmp/backup.os/date + \% Y - \% m - \% d) .sql "
ब्रूस एडगर

यह ध्यान देने योग्य है कि एक उप-संस्करण का उपयोग करना पर्यावरण चर में काम नहीं करता है। इसलिए, DATE=$( date -I )और फिर ${DATE}बाद $( date -I )में नौकरी की कमांड-लाइन में शाब्दिक रूप से उपयोग करने पर परिणाम ।
क्रिस्टोफर शुल्त्स

1
ऐसा लगता है कि %OpenSuse 42 पर भी इससे बचना आवश्यक है।
किलोडे

7

आप का उपयोग करने में सक्षम होना चाहिए date
प्रकार info dateया man dateविवरण के लिए।

निम्नलिखित जैसा कुछ आपको सूट कर सकता है (अपनी आवश्यकताओं के लिए दिनांक प्रारूप बदलें)

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

फिर से, %क्रोन के अंदर सभी वर्णों से बचने के लिए सावधान रहें ।
ग्लेन जैकमैन

@glenn: उफ़, यकीन है। लेक्सोग्राफिक ऑर्डर के अनुसार, मैंने अभी ओपी की तारीख के प्रारूप का मिलान किया। मुझे व्यक्तिगत रूप से आप की तरह आईएसओ प्रारूप पसंद है।
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

रात या जो भी आप पसंद करते हैं चलाने के लिए इस पर क्रॉन जॉब को इंगित करें।


यह एक आकर्षण की तरह काम करता है। हालाँकि, मुझे समझ में नहीं आ रहा है कि यहाँ क्या हो रहा है। क्या बैकटिक्स अन्य कार्यक्रमों या कुछ के आउटपुट को शामिल करने की अनुमति देता है? स्वरूपण के बारे में क्या है (जैसे +% F और ऐसा)?
एयरोक्रॉस

1
Yep backticks कमांड प्रतिस्थापन करता है जहां आउटपुट को कमांड के लिए प्रतिस्थापित किया जाता है। धारा 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.