1

我的项目是建立一个调度系统,通过cron表达式在特定时间调度一些爬虫,我选择使用quartz。我在 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 对象中执行?

4

1 回答 1

1

我怀疑您的子进程会生成一些输出然后被阻止,因为您没有在主进程中读取此输出。如果是这样,您有两种选择来解决此问题:

  • 显式读取子进程的输出流以防止其阻塞

或者

  • (仅限 Java 7)使用 ProcessBuilder API 将子项目的流与父项目的流合并:

    ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
    pb.inheritIO();
    进程 p = pb.start();

于 2013-06-16T16:11:21.693 回答