在给定时间执行不同的nodejs脚本

时间:2015-10-20 17:04:41

标签: javascript node.js ubuntu scheduled-tasks

我正在寻找一个很好的解决方案,在Ubuntu上运行的服务器上,在给定时间使用nodejs触发不同的javascript文件。

我有大约10个不同的脚本,每天应该被解雇15次!我的第一种方法是使用at,但这对于那么多事件来说真的很混乱。

现在我考虑过使用Node-Schedule你们中的一些人here提出的建议,但我不确定这是否是我工作的最佳解决方案......

如果Node-Schedule仍然是最好的方法 - 你会使用什么结构?

var schedule = require('node-schedule');
var d1 = new Date(2015, 10, 20, 18, 55, 0);
var d2 = new Date(2015, 10, 20, 18, 58, 0);

var xd1 = schedule.scheduleJob(d1, function(){
    test.js;
});

var xd2 = schedule.scheduleJob(d2, function(){
    test.js;
});

似乎没有干......;)

2 个答案:

答案 0 :(得分:1)

如果您需要每天运行脚本,则此基于日期的计划不是最佳解决方案。 cron样式调度更适合。

例如

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final ZipOutputStream out = new ZipOutputStream(baos);

        Calendar cal = Calendar.getInstance();
        String date = new SimpleDateFormat("MMM-dd").format(cal.getTime());

        final String zipName = "COA_Images-" + date + ".zip";



        for (Long id : ids){

            Object[] stream = inlineSamplesDataProvider.getAttachmentStream(id);


            if (stream) {

                String fileName = stream[0]
                String mimeType = (String) stream[1];
                InputStream inputStream = stream[2];
                byte[] byteStream = inputStream.getBytes();

                ZipEntry zipEntry = new ZipEntry(fileName)
                out.putNextEntry(zipEntry);
                out.write(byteStream, 0, byteStream.length);
                out.closeEntry();
            }
        }

        out.close();

        response.setHeader("Content-Disposition", "attachment; filename=\"" + zipName + "\"");
        response.setHeader("Content-Type", "application/zip");
        response.getOutputStream().write(baos.toByteArray());
        response.flushBuffer();
        baos.close();

每小时运行一次你的功能(0:00,1:00,2:00,等等=每天24次)。

var xd1 = schedule.scheduleJob('0 * * * *', function(){
    test.js;
});

每两小时运行一次你的功能(0:00,2:00,4:00,等等=每天12次)。

一天15次是一项艰难的要求吗?您无法使用cron语法轻松定义此类间隔,而无需将其拆分为不同的cronjobs(=使用相同的函数调用定义更多作业)。

这个例子每天运行15次,但在一天中不平衡:

var xd1 = schedule.scheduleJob('0 */2 * * *', function(){
    test.js;
});

答案 1 :(得分:1)

我不会创建一个节点程序来安排另一个节点程序。使用普通cron。

如果您可以每天运行16次而不是15次,那么您可以使用这两个cron表达式安排每90分钟:

' 0 0/3 * * * node test.js'
'30 1/3 * * * node test.js'

如果必须是15次,这个时间表分配相当不错(最多每小时一次,至少每隔一小时一次,每天15次):

'0 0/2,1,9,17 * * * node test.js'

了解此计划有任何困难,请使用this site。如果你需要15个调用空间(每96分钟一次),我恐怕你需要将它们分成5个时间表:

 0 0,8,16  * * * node test.js
36 1,9,17  * * * node test.js
12 3,11,19 * * * node test.js
48 4,12,20 * * * node test.js
24 6,14,22 * * * node test.js