Nodejs crontab 无法执行 coffee 程序的问题
Nodejs crontab 无法执行 coffee 程序的问题
express框架下coffee程序:
http = require 'http'
EventEmitter = require('events').EventEmitter
exports.importRequestNumber = (db, datetime)->
COL = db.collection 'requestData'
em = new EventEmitter()
process.nextTick ->
em.emit 'query data'
em.once '500', (err)->
console.log 'Error in import_data: ' + err
console.log err.stack
return em.emit 'error', err
em.once 'done', ->
return em.emit 'end'
em.once 'query data', ->
body = ''
reqGet = http.get "http://test.komoxo.com:5000/cut?date="+datetime,(response)->
response.on 'data', (chunk)->
body += chunk
response.on 'end', ()->
data = JSON.parse data
em.emit 'update data', data
reqGet.on 'error', (e)->
em.emit '500', e
reqGet.end()
em.once 'update data', (data)->
COL.update {date: datetime}, {$set: {count: data.data.a, total: data.data.n, placecount: data.data.c}}, {upsert: true}, (err)->
if err
em.emit '500', err
em.emit 'done'
if !module.parent
db = require('./db').defaultDb()
argv = process.argv[2..]
if argv[0]
datetime = argv[0]
l=exports.importRequestNumber db, datetime
l.once 'error', ->
process.exit -1
l.once 'end', ->
process.exit 0
直接用coffee命令执行程序没问题,但在crontab下执行报错
crontab 环境变量已设置 运行程序,http.get请求时报
Failed to load c++ bson extension, using pure JS version (这个警告应该没影响的。。。)
Error in import_data: Error: connect ECONNREFUSED
Error: connect ECONNREFUSED
at errnoException (net.js:646:11)
at Object.afterConnect [as oncomplete] (net.js:637:18)
不知道,哪位大神遇到过类似问题,跪求帮助啊。。。
我随便猜测一下,会不会跟监听的端口有关呢?
这个问题跟 crontab 和 coffee 都没有关系吧? 做爬虫的时候,考虑一下远端服务器的防爬策略
首先你得确定这个错误是来自query data
的阶段还是update data
的阶段,我怀疑是在update data
阶段出错的。
有无可能是那个db
对象打开了一个socket连接数据库服务器,但是在任务完成后,就直接process.exit 0
了,导致这个socket被占用。
因此,再次运行这个程序时,就被拒绝连接了。
从错误信息来看,问题可能出在环境变量或者网络连接上。ECONNREFUSED
错误表示连接被拒绝,可能是由于 http.get
请求的目标服务器未运行或无法访问。
解决步骤
-
检查目标URL是否可访问: 在你的环境中手动测试该URL是否能正常访问。可以使用
curl
或浏览器访问http://test.komoxo.com:5000/cut?date=<datetime>
来确认。 -
确保环境变量正确配置: 确认 crontab 中 Node.js 和 CoffeeScript 的路径配置正确。可以在 crontab 文件中添加以下内容来设置环境变量:
* * * * * export PATH=/usr/local/bin:/usr/bin:$PATH; coffee /path/to/your/file.coffee <datetime>
-
检查网络权限: 确保 crontab 脚本中的 Node.js 进程有权限访问外部网络。有时 crontab 运行的进程可能会受到防火墙或安全策略的限制。
示例 crontab 配置
假设你的脚本位于 /home/user/scripts/import.coffee
,你可以这样配置 crontab:
* * * * * export PATH=/usr/local/bin:/usr/bin:$PATH; coffee /home/user/scripts/import.coffee $(date +%Y-%m-%d)
示例代码修正
为了更好地调试,可以修改代码以记录更多日志信息:
http = require 'http'
EventEmitter = require('events').EventEmitter
exports.importRequestNumber = (db, datetime) ->
COL = db.collection 'requestData'
em = new EventEmitter()
# 添加日志记录
console.log "Starting request for datetime: #{datetime}"
process.nextTick ->
em.emit 'query data'
em.once '500', (err) ->
console.error 'Error in import_data:', err
console.error err.stack
return em.emit 'error', err
em.once 'done', ->
return em.emit 'end'
em.once 'query data', ->
body = ''
reqGet = http.get "http://test.komoxo.com:5000/cut?date=#{datetime}", (response) ->
response.on 'data', (chunk) ->
body += chunk
response.on 'end', () ->
try
data = JSON.parse(body)
em.emit 'update data', data
catch e
em.emit '500', e
reqGet.on 'error', (e) ->
console.error "Error in http.get:", e
em.emit '500', e
reqGet.end()
em.once 'update data', (data) ->
try
COL.update {date: datetime}, {$set: {count: data.data.a, total: data.data.n, placecount: data.data.c}}, {upsert: true}, (err) ->
if err
em.emit '500', err
em.emit 'done'
catch e
em.emit '500', e
总结
确保你的 crontab 脚本正确设置了环境变量,并且目标URL可访问。通过增加日志记录可以帮助你更好地诊断问题。