2009-04-23 43 views
5

Tôi có một tập lệnh perl (một phần của nhóm "grabbers" XMLTV, cụ thể là tv_grab_oztivo).Tại sao dòng lệnh của tôi không chạy từ cron?

tôi thành công có thể chạy nó như thế này:

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

tôi sử dụng đầy đủ các đường dẫn đến tất cả mọi thứ để loại bỏ vấn đề với thư mục làm việc. Quyền không phải là vấn đề.

Vì vậy, nếu tôi chạy nó từ thiết bị đầu cuối (Mac OSX) nó hoạt động tốt.

Nhưng khi tôi thiết lập để chạy thông qua một công việc cron, không có gì xuất hiện để xảy ra cả. Không có đầu ra nào được tạo ra vv

Không có gì sai với crontab như tôi thấy, bởi vì nếu tôi thay thế một helloworld.pl cho tập lệnh thực, nó sẽ chạy tốt vào đúng thời điểm.

Vì vậy, tôi có thể làm gì để gỡ lỗi? Tôi có thể thấy từ việc xem xét %ENV trong hai trường hợp môi trường rất khác nhau, nhưng tôi có thể thực hiện các phương pháp nào khác để gỡ lỗi? Làm thế nào tôi có thể nhìn thấy đầu ra của công việc cron, mà có thể là một số loại tin nhắn "chết" perl hoặc tin nhắn "không tìm thấy" từ vỏ hoặc bất cứ điều gì?

Hoặc tôi có nên cố gắng bằng cách nào đó cung cấp phiên bản cron của lệnh có môi trường giống như khi nó chạy với tư cách tôi không?

Trả lời

8

Đó là thường là vì bạn không nhận được môi trường đầy đủ khi chạy dưới cron. Đặt cược tốt nhất là để nắm bắt các ouput bằng cách sử dụng lệnh:

(/sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 

và sau đó có một cái nhìn tại /tmp/qq.

Nếu nó bật ra được một môi trường mất tích, sau đó bạn có thể cần phải đặt:

. ~/.profile 

hoặc một cái gì đó tương tự, vào chuỗi thực hiện các công việc định kỳ của bạn, chẳng hạn như:

(. ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 
+0

Nó hoạt động. Cảm ơn bạn. Cuối cùng tôi chỉ thêm PERL5LIB và PATH vào $ ENV và tất cả đều tốt. – AmbroseChapel

-1

cron thường ghi lại đầu ra của stdout và stderr và e-mail bất kỳ đầu ra nào cho chủ sở hữu crontab.

Bạn đã kiểm tra kỹ mục nhập crontab của mình để chắc chắn rằng nó hợp lệ và sẽ thực hiện vào đúng thời điểm?

Đảm bảo rằng tập lệnh không cần bất kỳ biến môi trường nào được đặt. Nếu không, hãy bọc nó trong một tập lệnh (bash) khác, nơi bạn có thể đặt các biến môi trường mà kịch bản lệnh khác mong đợi.

+0

"Bạn đã kiểm tra kỹ mục nhập crontab của mình để đảm bảo rằng nó hợp lệ và sẽ thực hiện vào đúng thời điểm?" -- Vâng. Tôi đã nói vậy. – AmbroseChapel

+0

Đừng bận tâm, tôi cũng muốn kiểm tra lại. Cú pháp crontab rất phức tạp và rất dễ làm sai. – lothar

+0

Nếu bạn không nhận được đầu ra cron được gửi qua thư cho bạn, bạn có thể sử dụng [email protected] ở đầu crontab của bạn để thay đổi kết quả đầu ra. Chỉ cần đảm bảo bưu phẩm địa phương của bạn hoạt động. – preaction

3

Nếu bạn đang xem% ENV trong hai trường hợp, tôi đề nghị rằng, như là bước đầu tiên trong tập lệnh perl của bạn, hãy đặt% ENV thành công việc cron, và sau đó cố gắng chạy nó từ dòng lệnh. Bạn có thể cần phải exec mình một lần cho này có toàn quyền kiểm soát:

BEGIN { 
    if (exists $ENV{something_in_your_env_not_in_cron}) { 
    %ENV = (...); 
    exec $^X, $0, @ARGV; 
    } 
} 

Bây giờ thử chạy nó, và nhìn thấy nếu có bất cứ điều gì bạn có thể làm để gỡ lỗi nó (bao gồm cả chạy dưới perl -d nếu có yêu cầu).Nhiều khả năng, bạn sẽ thấy rằng bạn sẽ chỉ thêm các mục trở lại vào% ENV một lần cho đến khi nó bắt đầu hoạt động một cách kỳ diệu (LD_LIBRARY_PATH là tốt nhất cho điều này, nhưng ORACLE_HOME hoặc DB2HOME cho các ứng dụng Oracle hoặc DB2 có thể là lựa chọn tốt). Sau đó, bạn có thể đặt biến trong tập lệnh của bạn hoặc trong crontab.

+1

Cảm ơn sự giúp đỡ của bạn với điều này, bạn thực sự bình đẳng với Pax trong việc giúp đỡ tôi nhưng tôi chỉ có thể đưa ra một câu trả lời đúng, xin lỗi. – AmbroseChapel

0

Tôi sẽ chạy tập lệnh shell đơn giản bằng đường dẫn tuyệt đối từ lệnh cron. Bên trong tập lệnh đó, tôi đảm bảo rằng tôi đã bị chặn stdout và stderr vào một tệp đã biết (hoặc có thể biết). Tôi cũng đảm bảo rằng đủ môi trường của bạn được thiết lập. Trên Unix, bạn hầu như không có môi trường nào được thiết lập khi bạn chạy lệnh thông qua cron - Tôi không chắc chắn về MacOS X. Thủ phạm tiêu chuẩn cho các vấn đề là PATH. Tôi có một riêng biệt .cronfile mà đặt môi trường làm việc của tôi đủ mà tôi thường không có vấn đề - đó là một tương tự của .profile.

0

Nhân dịp nếu bạn không thể tìm ra những gì đang xảy ra với dòng lệnh của bạn, cách đơn giản nhất để sửa chữa nó là biến toàn bộ nội dung thành một kịch bản lệnh shell. Lý tưởng nhất là bạn không nên để thực hiện việc này, nhưng đây có thể là cách nhanh nhất để giải quyết vấn đề.

File: /files/cron1.sh

#!/bin/sh 
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

Và sau đó trong cron:

/files/cron1.sh 

Điều này cho phép bạn kiểm tra kịch bản độc lập của cron. Hãy nhớ rằng mặc dù shell đăng nhập của bạn chạy với các biến môi trường khác với cron.

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