crontab 无法执行 coffee程序的问题
发布于 10 年前 作者 wangjinlu 4683 次浏览 最后一次编辑是 8 年前 来自 问答

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)

不知道,哪位大神遇到过类似问题,跪求帮助啊。。。

8 回复

我随便猜测一下,会不会跟监听的端口有关呢?

这个问题跟 crontab 和 coffee 都没有关系吧? 做爬虫的时候,考虑一下远端服务器的防爬策略

@alsotang 这个调用的是内部的服务器接口,没涉及到防爬的问题

@alsotang 找不到错误在哪。。所以改成python了

首先你得确定这个错误是来自query data的阶段还是update data的阶段,我怀疑是在update data阶段出错的。

有无可能是那个db对象打开了一个socket连接数据库服务器,但是在任务完成后,就直接process.exit 0了,导致这个socket被占用。 因此,再次运行这个程序时,就被拒绝连接了。

@bnuhero 我开始也以为是update data阶段出错,后来监控了一下,在http.get阶段没触发em.emit ‘update data’, data,而是reqGet.on ‘error’, (e)-> em.emit ‘500’, e这里触发了;

@wangjinlu

那就很奇怪。不过有一点,根据http.get()的文档,与http.request()相比,http.get()有下列不同:

  • 没有body
  • 自动设置请求的方法为GET
  • 自动调用req.end()

所以,你的代码中的reqGet.end()应该去掉。

@bnuhero 学习了,谢谢

回到顶部