2013-03-05 19 views
5

Tập lệnh của tôi sử dụng mysql, tiny_tds, fileutils và net/ftp. Chạy trên ruby ​​1.9.3. Nó hoạt động hoàn hảo tốt khi tôi chạy nó từ bên trong thư mục.Thực thi tập lệnh ruby ​​từ cron

Tuy nhiên, khi tôi thêm nó vào tab cron, tiny_tds liên tục thất bại. Tôi không biết nếu một trong các đá quý khác thất bại như tôi không thể có được thông qua lỗi này:

require': no such file to load -- tiny_tds (LoadError)

Tôi đã cố gắng thực hiện nó từ vỏ tương tự mà crontab sẽ sử dụng, và tôi nhận được lỗi đó.

Toàn bộ tập lệnh chỉ là 1 tệp.

Tôi mới sử dụng ruby ​​nên kiến ​​thức của tôi bị hạn chế trong việc thiết lập môi trường đúng cách.

Trong phần đầu của file tôi có

#!/usr/bin/ruby 
    require "mysql" 
    require "fileutils"; 
    require "tiny_tds" 
    require "net/ftp" 

Nói tóm lại, tôi nhận được một danh sách các Jobs từ mysql, so sánh rằng với MSSQL, FTP tập tin hơn và cập nhật mysql một lần nữa khi công việc đã hoàn thành.

Và tôi cần chạy điều này từ cron.

Sau khi nghiên cứu một chút, tôi đã cố gắng đặt các đá quý thành toàn cầu, tuy nhiên, tôi nghĩ rằng có thể không hoạt động.

Cảm ơn trước sự giúp đỡ nào!

+0

nào bạn tìm thấy một giải pháp cho t của anh ấy? –

Trả lời

5

Điều này là do các biến môi trường bạn có trên dòng lệnh không được đặt khi crond thực thi bạn mã. Các nghi phạm thông thường là PATH, LD_LIBRARY_PATH và bí danh được đặt khi bạn đăng nhập.

Bạn có thể xem những gì crond không: sử dụng crontab -e

* * * * * set > /tmp/setvals 

tạo các mục nhập trên. hãy để nó chạy một lúc. Quay trở lại vào crontab -e và xóa mục nhập mới đó.

So sánh nội dung trong số /tmp/setvals với những gì vỏ của bạn cung cấp cho bạn khi bạn phát hành lệnh set trên dòng lệnh. Sau đó, bạn có thể thực hiện các bước để sửa đổi mọi thứ cho môi trường công việc của cron.

2

Có nhiều cách để RVM hợp tác với cron, nếu bạn sử dụng kịch bản thì đơn giản nhất là chỉ cần sử dụng RVM - có nghĩa là không sử dụng hệ thống ruby ​​#!/usr/bin/ruby - chỉ cần đặt trong dòng đầu tiên #!/path/to/rvm/wrappers/ruby-1.9.3-p392/ruby

bạn có thể sử dụng bí danh để ngăn chặn hardcoding con đường một ruby ​​trong một kịch bản:

rvm alias create my_app 1.9.3 

và sau đó trong phần đầu kịch bản (dòng đầu tiên):

#!/path/to/rvm/wrappers/my_app/ruby