2012-11-19 13 views
12

Tôi có một tập lệnh ruby ​​kết nối với một thùng S3 của Amazon và tải xuống bản sao lưu sản xuất mới nhất. Tôi đã thử nghiệm kịch bản (rất đơn giản) và nó hoạt động tốt.Công việc Cron không thể tải đá quý

Tuy nhiên, khi tôi lên lịch tập lệnh này để chạy dưới dạng công việc cron có vẻ như nó không thành công khi nó tải đá quý Amazon (aws-s3).

Một vài dòng đầu tiên của kịch bản của tôi trông như thế này:

#!/usr/bin/env ruby 
require 'aws/s3' 

Như tôi đã nói, khi tôi chạy kịch bản này bằng tay, nó hoạt động tốt. Khi tôi chạy nó thông qua một công việc định kỳ theo lịch trình, nó không thành công khi nó cố gắng để tải đá quý:

'đòi hỏi': không có tập tin để tải - AWS/s3 (LoadError)

Các crontab cho kịch bản này trông như thế này:

0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1 

tôi ban đầu nghĩ rằng nó có thể là do cron đang chạy như một người dùng khác nhau, nhưng khi tôi làm một 'whoami' vào lúc bắt đầu của kịch bản ruby ​​của tôi nó nói với tôi nó chạy là cùng một người dùng mà tôi luôn sử dụng.

Tôi cũng đã thực hiện một gói init và thêm đá quý vào gemfile của tôi, nhưng điều này dường như không có bất kỳ ảnh hưởng nào.

Tại sao cron không tải đá quý? Tôi đang chạy Ubuntu.

Trả lời

11

Nếu bạn đang chạy nó theo cách thủ công và nó hoạt động có thể bạn đang ở trong một môi trường shell khác với cron đang thực hiện. Vì bạn đề cập đến bạn đang ở trên Ubuntu, các cron job có thể thực thi dưới/bin/sh, và bạn tự chạy chúng dưới/bin/bash nếu bạn không thay đổi gì cả.

Bạn có thể gỡ lỗi các vấn đề môi trường của mình hoặc bạn có thể thay đổi trình bao mà công việc của bạn chạy dưới.

Để gỡ lỗi, có một số cách để tìm hiểu xem công việc cron của bạn đang sử dụng. Nó có thể được quy định tại

/etc/crontab 

hoặc bạn có thể làm một công việc định kỳ để đổ vỏ và thông tin môi trường, như đã được đề cập trong này SO trả lời: How to simulate the environment cron executes a script with?

Để chuyển sang vỏ đó và thấy thực tế các lỗi khiến công việc của bạn thất bại, hãy làm

sudo su 
env -i <path to shell> (e.g. /bin/sh) 

Sau đó chạy tập lệnh của bạn, bạn sẽ thấy lỗi và có thể sửa chúng (rubygems?).

Tùy chọn 2 là chuyển đổi vỏ. Bạn luôn có thể thử một cái gì đó như:

0 3 * * * /bin/bash -c '~/Downloader/download.rb > ~/Downloader/output.log 2>&1' 

Để buộc công việc của bạn bị bash. Điều đó cũng có thể làm rõ mọi thứ.

+2

Hóa ra tôi cần cài đặt rubygem trong vỏ đó. Điều này đã giúp tôi theo dõi nó. –

0

trong một môi trường cron không thực hiện echo $PATH, sao chép đường dẫn và dán nó vào crontab của bạn, trước khi lệnh của bạn:

echo $PATH 
/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 

và bên trong crontab:

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 
0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1 
4

Bạn cũng có thể thiết lập một cách rõ ràng của bạn Đường dẫn đá quý:

GEM_HOME="/usr/local/rvm/gems/[email protected]"

+0

Bạn có thể kiểm tra trang chủ đá quý của mình trong môi trường không phải là cron: 'echo $ GEM_HOME' – thiagotonon

22

Như đã đề cập ở đây https://coderwall.com/p/vhv8aw bạn chỉ có thể cố gắng

rvm cron setup # let RMV do your cron settings

Hãy chắc chắn rằng bạn thực hiện bản sao của crontab của bạn trước khi chạy lệnh này

+1

Bạn tiết kiệm cuộc sống của tôi, cảm ơn nhiều. – overallduka

+5

Noice. Chỉ cần chắc chắn để sao lưu crontab của bạn trước khi nó bị xóa của tôi. – Peleg

+1

Cảm ơn bạn vì điều này, chỉ mất 2 giờ khóc. –

1

Thêm này vào đầu cron của bạn

PATH="/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/home/user/.rvm/bin:/usr/local/sbin:/usr/sbin:/home/user/.rvm/bin:/home/user/.local/bin:/home/user/bin" 
GEM_HOME='/home/user/.rvm/gems/ruby-2.1.4' 
GEM_PATH='/home/user/.rvm/gems/ruby-2.1.4:/home/user/.rvm/gems/[email protected]' 
MY_RUBY_HOME='/home/user/.rvm/rubies/ruby-2.1.4' 
IRBRC='/home/user/.rvm/rubies/ruby-2.1.4/.irbrc' 
RUBY_VERSION='ruby-2.1.4' 
Các vấn đề liên quan