【问题标题】:I have a cron job running a casperjs file - executes fine (writes to log) but why doesn't the cron output the expected json?我有一个运行 casperjs 文件的 cron 作业 - 执行良好(写入日志)但为什么 cron 不输出预期的 json?
【发布时间】:2016-10-17 21:02:45
【问题描述】:

情况:在我的 crontab 中,我有一份运行 .sh 脚本的工作。该脚本依次执行我的 casperjs casper.js - 一切正常。该脚本在我从命令行运行时执行。从命令行调用 shell 脚本时,可以正常执行。我从 crontab 运行作业并输出到日志文件,我可以看到它正在工作。

但是,我从来没有得到预期的输出:即。 casper_output.json,这是运行的完整 casper.js 文件:

 var casper = require('casper').create({
    waitTimeout: 10000,
    stepTimeout: 10000,
    verbose: true,
    //debug, write out results, errors
    logLevel: "debug",
    loadImages: true,
    loadPlugins: true,
    pageSettings: {
        javascriptEnabled: true,
        webSecurityEnabled: false
    },
    onWaitTimeout: function() {
        this.echo('** Wait-TimeOut **');
    },
    onStepTimeout: function() {
        this.echo('** Step-TimeOut **');
    }
});

//vars for this page
var url = 'http://urltoscrape.com';
var results = [];
var menuResults = [];
var fs = require('fs');
var terminate = function() {
    this.echo("Exiting..").exit();
};

var getContent = function() {
    //grab the values that we need for json file, store in empty results array
    var results = [];
    var URL = document.querySelectorAll('#results .event-details-link');
    var title = document.querySelectorAll('#results h3');
    var date = document.querySelectorAll('#results span');
    var desc = document.querySelectorAll('#results p');

    for (var i = 0; 
        //count through URL, title, date and description
        i < URL.length 
        && i < title.length 
        && i < date.length
        && i < desc.length;
        i++) {
        var innerURL = URL[i].getAttribute("href");;
        var innerTitle = title[i].innerText;
        var innerDate = date[i].innerText;
        //messy regex, TODO: make more efficient
        var newDate = innerDate.replace(/\s[at].*$/g,"");
        var strip = newDate.replace(/[on]/g,"");
        var nows = strip.replace(/\s/g, "");
        var innerDesc = desc[i].innerText;
        var dept = "Dept";
        //push into json, TODO: order
        results.push({ URL: innerURL, title: innerTitle, date: nows, desc: innerDesc, dept: dept});        
    }
    return results;
}

var processPage = function() {
    //crude but waits for page to load
    this.wait(2000, function() {
        //run the get content function
        results = this.evaluate(getContent);
        require('utils').dump(results);
        //write to file
        fs.write("casper_output.json", JSON.stringify(results, null, '  '), 'w');
    });
}

casper.start(url, function() {
    this.waitForSelector('#results', processPage, terminate);
});

casper.run();

调用它的shell脚本,casper_run.sh

#!/bin/bash
PATH=/output/of/path/MAMP/Library/bin
PHANTOMJS_EXECUTABLE=/usr/local/bin/phantomjs ; /usr/local/bin/casperjs /Applications/AMPPS/www/test/casper.js 2>&1

最后,在我的 crontab 中:

* * * * * /Applications/AMPPS/www/test/casper_run.sh

任何关于为什么 casper_output.json 不从我的 cron 作业中写入(但从命令行运行时)的见解都会非常受欢迎。我研究这个太久了。

谢谢!

【问题讨论】:

    标签: json bash shell cron casperjs


    【解决方案1】:

    Cron(或者更确切地说是 CasperJS)可能没有写入当前工作目录的写入权限。

    你可以通过 PhantomJS 的文件系统模块change the working directory 或者你可以使用完整路径:

    fs.write("/Applications/AMPPS/www/test/casper_output.json", JSON.stringify(results, null, '  '), 'w');
    

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2015-07-02
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多