2016-10-17 5 views
0

상황 : 내 crontab에서, 나는 .sh 스크립트를 실행하는 직업이 있습니다. 이 스크립트는 차례로 내 말을 실행합니다. casperjs casper.js - 모든 것이 정상적으로 작동합니다. 스크립트는 명령 행에서 실행할 때 실행됩니다. 쉘 스크립트는 명령 행에서 호출 될 때 정상적으로 실행됩니다. 내가 crontab에서 작업을 실행하고 로그 파일에 출력, 나는 그것이 작동하는지 볼 수 있습니다.나는 casperjs 파일을 실행하는 cron 작업을 가지고있다 - 로그를 쓰면 좋지만 왜 cron이 예상 한 json을 출력하지 않는가?

그러나 기대 한 결과를 얻을 수 없습니다. 즉.

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(); 

을 호출하는 쉘 스크립트, casper_run.sh : casper_output.json, 여기 실행 전체 casper.js 파일에 마지막으로

#!/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 작업에서 쓰지 않는 이유에 대한 어떤 통찰 (그러나이 때 연구를 수행 un 명령 줄에서) 너무 환영합니다. 나는 이것을 너무 오랫동안 연구 해왔다.

감사합니다.

답변

1

Cron (또는 CasperJS)은 현재 작업 디렉토리에 쓸 수있는 쓰기 권한이 없습니다.

당신 PhantomJS '파일 시스템 모듈을 통해 change the working directory하거나 전체 경로 사용할 수 있습니다

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