我的项目是建立一个计划系统,通过cron表达式在特定时间安排一些爬虫,我选择使用石英。我在Job对象中创建一个子进程。在安排作业时,它会创建一个启动scrapy搜寻器来获取数据的进程,而父进程正在等待使用waitFor() java api.
Sth,如下所示:
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
JobKey jobKey = context.getJobDetail().getKey();
System.out.println("CrawlerJob says: " + jobKey + " executing at " + new Date());
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String scrapycmd=dataMap.getString("ScrapyCMD");
Process process=Runtime.getRuntime().exec(scrapycmd);
System.out.println("wait for process...");
process.waitFor();
}catch(InterruptedException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
_log.info(e.toString());
}
}
ScrapyCMD是scrapy crawl myspider
。但是,当它安排时,我发现这个过程只能在非常短的时间内完成,然后我正在使用ps -aux | grep python
:
gabriel 4202 0.0 1.0 755672 39400 pts/2 Sl+ 22:14 0:02 /usr/local/bin/python /usr/local/bin/scrapy crawl myspider
子进程的状态是sl +,整个进程在那里停止。如何修复它并让子进程在这个Job对象中执行?
答案 0 :(得分:1)
我怀疑您的子进程会生成一些输出然后被阻止,因为您没有在主进程中读取此输出。如果是这样,您有两种方法可以解决此问题:
或
(仅限Java 7)使用ProcessBuilder API将子项目的流与父流的流合并:
ProcessBuilder pb = new ProcessBuilder(“myCommand”,“myArg1”,“myArg2”);
pb.inheritIO();
过程p = pb.start();