2013-04-12 27 views
7

Tôi có một ruby ​​script đơn giản, hello.rb:#/usr/bin/env ruby ​​không tìm thấy trong cron

#!/usr/bin/env ruby 
puts 'hello' 

Nó chạy ok tại cửa sổ dòng lệnh:

# /usr/local/src/hello/hello.rb 
hello 

Tuy nhiên, nếu tôi đặt nó trong cron:

* * * * * /usr/local/src/hello/hello.rb >> /usr/local/src/hello/hello.log 2>&1 

có lỗi trong file log:

/usr/bin/env: ruby: No such file or directory 
/usr/bin/env: ruby: No such file or directory 
... 
/usr/bin/env: ruby: No such file or directory 

/usr/bin/env ruby chạy ok tại dòng lệnh mặc dù:

# /usr/bin/env ruby -v 
ruby 1.8.7 (2012-10-12 patchlevel 371) [i686-linux] 

Làm thế nào để sửa lỗi env cho cron?

Trả lời

16

Vấn đề là môi trường không phải là những gì bạn mong đợi.

Bạn không nói liệu cron đang chạy như người dùng của bạn, hoặc như là người chủ, nhưng, trong cả hai trường hợp, bạn có thể kiểm tra để xem những gì môi trường trông giống như bằng cách thêm một mục nhập cron của:

* * * * * /usr/bin/env > /path/to/your/home/directory/env.txt 

Để điều đó chạy một lần, sau đó kéo nó ra và xem tệp.

Thay vì sử dụng /usr/bin/env để cố gắng tìm một Ruby để chạy mã của bạn, xác định Ruby một cách rõ ràng:

* * * * * /path/to/the/ruby/you/want /usr/local/src/hello/hello.rb >> /usr/local/src/hello/hello.log 2>&1 

Bạn có thể tìm ra Ruby bạn muốn bằng cách sử dụng:

which ruby 

Cách khác , thay vì dựa vào số /usr/bin/env trong # của bạn! , xác định Ruby của bạn ở đó.

Sử dụng /usr/bin/env ruby trong mã của bạn là một sự thuận tiện khi bạn đang sử dụng một cái gì đó như RVM hoặc rbenv và chuyển đổi giữa các phiên bản của Ruby. Nó không phải là một lựa chọn tốt khi bạn đang đặt một cái gì đó vào "sản xuất", cho dù đó là trên máy tính của bạn trong tài khoản của riêng bạn, hoặc trên một máy chủ sản xuất chạy như là người chủ.

Nếu bạn đang sử dụng Linux hoặc Mac OS, hãy thử man 5 crontab để biết thêm thông tin. Ngoài ra, "Where can I set environment variables that crontab will use?" sẽ rất hữu ích.

+1

Câu hỏi nào bạn vừa trả lời đúng. Nhưng các biến env đến từ crond, không phải hồ sơ người dùng của bạn. Đó là toàn bộ vấn đề. –

+0

Tôi đã sử dụng '/ usr/local/bin/ruby ​​.../hello.rb'. – ohho

3

chỉ tìm kiếm env trong biến PATH hiện có. crond tạo ra quá trình chạy như tên người dùng của bạn. Vì vậy, PATH là tối thiểu. Bạn phải thiết lập biến môi trường của mình trong tập lệnh chính nó

+1

crond có thể chạy crontabs cho root hoặc cho bất kỳ người dùng nào trên hệ thống. –

+0

Đúng nhưng CNTT KHÔNG ĐĂNG NHẬP NHƯ BẠN. Vì vậy, các biến không phải của bạn, bạn kế thừa chúng. –

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