2008-08-16 21 views
7

मेरे पास उबंटू हार्डी वीपीएस पर एक क्रॉन नौकरी है जो केवल आधे काम करता है और मैं क्यों काम नहीं कर सकता। नौकरी एक रूबी स्क्रिप्ट है जो एक रेल अनुप्रयोग द्वारा उपयोग किए गए एक MySQL डेटाबेस का बैक अप लेने के लिए mysqldump का उपयोग करती है, जिसे तब gzipped और SFTP का उपयोग कर रिमोट सर्वर पर अपलोड किया जाता है।मेरा क्रॉन नौकरी उचित तरीके से क्यों नहीं काम करता है?

gzip फ़ाइल बनाई गई है और सफलतापूर्वक कॉपी की गई है लेकिन यह हमेशा शून्य बाइट्स है। फिर भी अगर मैं सीधे कमांड लाइन से क्रॉन कमांड चलाता हूं तो यह पूरी तरह से काम करता है।

PATH=/usr/bin 
10 3 * * * ruby /home/deploy/bin/datadump.rb 

यह datadump.rb है:

इस क्रॉन जॉब है

#!/usr/bin/ruby 
require 'yaml' 
require 'logger' 
require 'rubygems' 
require 'net/ssh' 
require 'net/sftp' 

APP  = '/home/deploy/apps/myapp/current' 
LOGFILE = '/home/deploy/log/data.log' 
TIMESTAMP = '%Y%m%d-%H%M' 
TABLES  = 'table1 table2' 

log  = Logger.new(LOGFILE, 5, 10 * 1024) 
dump  = "myapp-#{Time.now.strftime(TIMESTAMP)}.sql.gz" 
ftpconfig = YAML::load(open('/home/deploy/apps/myapp/shared/config/sftp.yml')) 
config  = YAML::load(open(APP + '/config/database.yml'))['production'] 
cmd  = "mysqldump -u #{config['username']} -p#{config['password']} -h #{config['host']} --add-drop-table --add-locks --extended-insert --lock-tables #{config['database']} #{TABLES} | gzip -cf9 > #{dump}" 

log.info 'Getting ready to create a backup' 
`#{cmd}`  

# Strongspace 
log.info 'Backup created, starting the transfer to Strongspace' 
Net::SSH.start(ftpconfig['strongspace']['host'], ftpconfig['strongspace']['username'], ftpconfig['strongspace']['password']) do |ssh| 
    ssh.sftp.connect do |sftp| 
    sftp.open_handle("#{ftpconfig['strongspace']['dir']}/#{dump}", 'w') do |handle| 
     sftp.write(handle, open("#{dump}").read) 
    end 
    end 
end 
log.info 'Finished transferring backup to Strongspace' 

log.info 'Removing local file' 
cmd  = "rm -f #{dump}" 
log.debug "Executing: #{cmd}" 
`#{cmd}` 
log.info 'Local file removed' 

मैं देख लिया है और सभी रास्तों की दोबारा जांच कर और वे सही कर रहे हैं। sftp.yml (एसएफटीपी प्रमाण-पत्र) और डेटाबेस.मिल (MySQL प्रमाण-पत्र) निष्पादन उपयोगकर्ता (तैनाती) के स्वामित्व वाले उपयोगकर्ता (chmod 400) के लिए केवल पढ़ने की अनुमति के साथ स्वामित्व में हैं। मैं net-ssh और net-sftp के 1.1.x संस्करणों का उपयोग कर रहा हूं। मुझे पता है कि वे नवीनतम नहीं हैं, लेकिन वे इस समय से परिचित हैं।

क्रॉन नौकरी विफल होने के कारण क्या हो सकता है?

उत्तर

2

क्या आप सुनिश्चित हैं कि क्रॉन नौकरी के रूप में चलते समय अस्थायी फ़ाइल सही तरीके से बनाई जा रही है? आपकी स्क्रिप्ट के लिए कार्य निर्देशिका को या तो होम पर्यावरण चर, या क्रॉन नौकरी स्थापित करने वाले उपयोगकर्ता के लिए/etc/passwd प्रविष्टि में निर्दिष्ट किया जाएगा। यदि तैनाती में निर्देशिका के लिए लिखने की अनुमति नहीं है जिसमें यह निष्पादित हो रहा है, तो आप समस्या को ठीक करने के लिए डंप फ़ाइल के लिए एक पूर्ण पथ निर्दिष्ट कर सकते हैं। अपने PATH, महत्वपूर्ण बात /bin (/bin/rm के लिए) सबसे कुछ निर्देशिकाओं याद आ रही है की तरह

4

लग रहा है। यहाँ अपने सिस्टम के /etc/crontab का उपयोग करता है:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
0

क्रॉन लॉग के साथ ईमेल भेजने है?

यदि नहीं, तो क्रॉन के आउटपुट को लॉग फ़ाइल में पाइप करें।

लॉग इन करने के लिए STDERR को पुनर्निर्देशित करना सुनिश्चित करें।

8

जब स्क्रिप्ट सही ढंग से सहभागी लेकिन नहीं चला जब क्रॉन द्वारा चलाए, समस्या आमतौर पर जगह में पर्यावरण पर्यावरण सेटिंग्स की वजह से है ... उदाहरण के लिए मार्ग के रूप में alrady @Ted पर्सिवल ने उल्लेख किया है, लेकिन अन्य वातावरण चर हो सकता है।

ऐसा इसलिए है क्योंकि क्रॉन निष्पादित करने से पहले .bash_profile, .bashrc या/etc/प्रोफ़ाइल को नहीं बुलाएगा।

इससे बचने का सबसे अच्छा तरीका यह सुनिश्चित करना है कि क्रॉन द्वारा बुलाई गई किसी भी स्क्रिप्ट को निष्पादित करते समय पर्यावरण के बारे में कोई धारणा न हो। यह सुनिश्चित करने के लिए कि पर्यावरण ठीक से सेटअप हो, यह आपकी स्क्रिप्ट में कुछ पंक्तियों को शामिल करने के समान सरल हो सकता है। उदाहरण के लिए, मेरे मामले में मैं/etc/प्रोफ़ाइल (RHEL के लिए) में सभी महत्वपूर्ण सेटिंग है, तो मैं किसी भी स्क्रिप्ट में निम्न पंक्ति शामिल होंगे क्रॉन के तहत चलाने के लिए:

source /etc/profile