2012-03-18 39 views
5

Tôi đã viết kịch bản lệnh Rake sẽ tự động chạy với Crontab. Kịch bản chạy tốt khi gõ vào dòng lệnh nhưng không chạy đúng trong cron.Kịch bản lệnh Shell của tôi khởi chạy Rake không chạy đúng khi được khởi chạy qua cron

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

#!/bin/sh 

echo `date` 
cd /home/mick/myapp/current 
rake RAILS_ENV=production mynamespace:myaction 

Thiết lập crontab trông như thế này:

10 0,6,12,18 * * * /home/mick/work/launch.sh >> /home/mick/work/launch.log 

Sau khi thực hiện, các log file chỉ chứa ngày nhưng không có gì khác, và lỗi tôi nhận được trong syslog trông giống như sau:

Mar 18 18:10:01 CRON[21773]: (mick) CMD (/home/mick/work/launch.sh >> /home/mick/work/launch.log) 
Mar 18 18:10:01 CRON[21772]: (CRON) error (grandchild #21773 failed with exit status 127) 
Mar 18 18:10:01 postfix/sendmail[21776]: fatal: open /etc/postfix/main.cf: No such file or directory 
Mar 18 18:10:01 CRON[21772]: (mick) MAIL (mailed 1 byte of output; but got status 0x004b, #012) 

EDIT:

Nhờ nhận xét của @Holger Just, tôi đã tìm thấy this link giúp tôi có một kịch bản làm việc.

Dưới đây là phiên bản cập nhật của kịch bản của tôi

#!/usr/bin/env bash # UPDATED TO GET ACCESS TO 'source' 

export PATH=blabla # NOT SURE THIS HELPED AS IT WAS MY FIRST MODIF AND DIDN'T FIX 
source /home/mick/.rvm/environments/default # LOADING RVM TO MAKE THINGS WORK 
echo `date` 
cd /home/mick/myapp/current 
rake RAILS_ENV=production mynamespace:myaction 
+0

Thậm chí tất cả nội dung môi trường được thêm vào tập lệnh ở đây đều không khắc phục được sự cố tương tự mà tôi gặp phải, nhưng một nguồn ~/.bash_profile đơn giản/quá mức "đã làm điều đó. – David

Trả lời

4

Cron thường có rất hạn chế $PATH. Vì vậy, bạn có thể đặt $PATH ở đầu tập lệnh hoặc sử dụng toàn bộ đường dẫn. Bạn có thể đặt đường dẫn trong tập lệnh của mình như

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

Tất nhiên bạn có thể cần điều chỉnh $PATH của mình. ví dụ. bạn có thể sử dụng vỏ đăng nhập của người dùng gốc của mình. Bạn có thể nhận được điều đó bằng cách chạy echo $PATH. Cũng lưu ý rằng nếu bạn sử dụng RVM, bạn cần tải nó trong kịch bản cron của bạn một cách rõ ràng vì cron không tải rvm (hoặc bất kỳ tập lệnh khởi tạo shell nào khác) theo mặc định.

+0

cảm ơn. Với đầu vào của bạn (dẫn tôi đến liên kết này), tôi hiểu nó hoạt động, câu hỏi đã chỉnh sửa –

Các vấn đề liên quan