2014-10-11 22 views
6

Tôi muốn máy chủ của mình thực thi tập lệnh nút mỗi phút. Chương trình thực hiện hoàn hảo nếu tôi thực thi tệp theo cách thủ công (./main.js), vì vậy tôi khá chắc chắn đó không phải là vấn đề. Nhưng khi tôi giao nó cho cron để thực hiện, không có gì xảy ra.Tại sao cron không thực thi tập lệnh node.js của tôi?

Đây là dòng từ tệp cron.

*/1 * * * * /home/bryce/scripts/wudu/main.js

Và đây là một bản ghi mẫu:

Oct 11 15:21:01 server CROND[2564]: (root) CMD (/home/bryce/scripts/wudu/main.js)

Các thực thi: home/bryce/scripts/wudu/main.js

#!/usr/bin/env node 

var program = require('commander'); 
var v = require('./cli/validation'); 
var a = require('./cli/actions'); 

program 
    .version('0.0.1') 
    .option('-u, --url', 'Register url') 
    .option('-s, --selector', 'Register selector') 
    .option('-p, --pagination', 'Register pagination') 
    .option('-i, --index', 'Pass an index, to destroy') 
    .parse(process.argv); 

var args = process.argv.slice(2), 
     mode = v.mode(args[0]), 
     options = v.hasArgs(mode, program); 

a.init(mode, options); 

Bất cứ ý tưởng tại sao tôi nhận được im lặng vô tuyến? Một nơi khác tôi nên tìm cách gỡ lỗi?

UPDATE:

Tôi tin rằng vấn đề đã làm với filepaths tương đối của tôi, và main.js được thực hiện từ bên ngoài thư mục riêng của mình.

Vì vậy, bây giờ, tôi đã đặt exe.sh trong thư mục wudu. Có vẻ như sau:

#!/bin/bash 

cd ${0%/*} 
./main.js mail 

exit 

Bây giờ, tôi đã đặt cron để thực thi tệp này mỗi phút. Tôi đã thử thực thi tệp này từ các thư mục khác và nó hoạt động như mong đợi. Nhưng một lần nữa, cron không nhặt nó lên.

+0

Có thể kiểm tra các đặc quyền thực thi trên tệp. –

+0

Điều đó làm tôi rối tung trước đó, nhưng tôi đã sửa nó rồi. Cảm ơn mặc dù. –

+0

tên đường dẫn tương đối: 'var v = require ('./ cli/validation');' Công việc cron của bạn không được khởi động trong thư mục '/ home/bryce/scripts/wudu /', nhưng pwd có lẽ là '/ home/bryce/'khi được gọi từ cron. – wildplasser

Trả lời

10

Gói thực thi trong tập lệnh shell, có khả năng việc thực thi tập lệnh trong cron không có cùng một môi trường được đặt khi bạn chạy từ dòng lệnh.

Hãy thử prefacing việc thực hiện các kịch bản shell trong cron với thiết NODE_PATH & PATH
(nếu bạn cần những giá trị này, trên một loại dòng lệnh: echo $NODE_PATHecho $PATH)

Vì vậy, mục cron của bạn sẽ trông như thế :

*/1 * * * * NODE_PATH=/usr/local/lib/node_modules PATH=/opt/local/bin:ABC:XYZ /home/bryce/scripts/wudu/exe.sh 

Chỉ cần chắc chắn để thay thế các giá trị thực tế cho NODE_PATH & PATH với những gì bạn nhận được từ thứ e echo lệnh mà bạn đã thực hiện trước tiên.

0

tôi đã có vấn đề chính xác cùng, vì vậy tôi đã kết thúc việc tạo ra một kịch bản passthrough đó sẽ nạp các biến môi trường của tôi, sau đó thực hiện nút như vậy:

##!/bin/bash 

# Source bash profile to load env variables 
# or any other that you want to set explicitly 
. ~/.bash_profile 

# tunnel that allows us to execute cron jobs 
node $1 $2 

Để sử dụng chỉ cần thêm nó vào crontab của bạn

* * * * * <user> <passthrough_script> <arg1> <arg2> 
Các vấn đề liên quan