سؤال

لدي وظيفة كرون على أوبونتو هاردي VPS فقط نصف تعمل وأنا لا يمكن أن يعمل.العمل هو روبي نصي يستخدم mysqldump لعمل نسخة احتياطية من قاعدة بيانات MySQL تستخدم القضبان التطبيق ، ثم المضغوطة و تحميل إلى ملقم بعيد باستخدام 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 (SFTP التفويض) ، قاعدة البيانات.yml (الخلية التفويض) مملوكة المنفذة المستخدم (نشر) مع أذونات للقراءة فقط لهذا المستخدم (chmod 400).أنا باستخدام 1.1.x إصدارات net-ssh و صافي-sftp.أعلم أنهم لا أحدث لكنهم ما أنا على دراية في هذه اللحظة.

ما يمكن أن يكون تسبب في وظيفة كرون أن تفشل ؟

هل كانت مفيدة؟

المحلول

هل أنت متأكد من الملف المؤقت يتم إنشاء بشكل صحيح عند تشغيل وظيفة كرون?دليل العمل على السيناريو الخاص بك إما أن تكون محددة في المنزل متغير البيئة أو /etc/passwd دخول المستخدم تثبيت وظيفة كرون.إذا نشر لا يكون لديك أذونات الكتابة عن الدليل الذي هو المنفذة ، ثم يمكن تحديد مطلقة مسار ملف تفريغ لإصلاح المشكلة.

نصائح أخرى

عند تشغيل البرامج النصية بشكل صحيح بشكل تفاعلي ولكن ليس عندما تديرها كرون, المشكلة عادة بسبب البيئة إعدادات البيئة في المكان ...على سبيل المثال مسار عندي كما ذكر من قبل @Ted بيرسيفال ، ولكن قد يكون البعض متغيرات البيئة.

هذا كرون لأنه لن الاحتجاج .bash_profile،.bashrc أو /etc/profile قبل تنفيذ.

أفضل طريقة لتجنب هذا هو التأكد من أي مخطوطات تحتج كرون لا تجعل أي افتراضات حول البيئة عند تنفيذ.على مدى القادمة وهذا يمكن أن تكون بسيطة مثل بما في ذلك بضعة أسطر في البرنامج النصي الخاص بك للتأكد من البيئة هو الإعداد بشكل صحيح.على سبيل المثال, في حالتي لدي كل كبيرة الإعدادات في الملف /etc/الملف (RHEL) ، لذلك سوف تشمل السطر التالي في أي البرامج النصية تشغيل تحت كرون:

source /etc/profile

يبدو أن PATH يفتقد بعض الدلائل ، والأهم من ذلك /bin (على /bin/rm).هنا ما كان النظام /etc/crontab الاستخدامات:

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

هو كرون إرسال رسائل البريد الإلكتروني مع السجلات?

إن لم يكن, أنبوب إخراج كرون إلى ملف سجل.

تأكد من توجيه STDERR إلى السجل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top