本博文仅仅是最近学习的总结,不喜勿喷。如有误导之处,烦请指出,非常感谢。
1、前期准备:现成的脚本文件Log.sh
2、定时任务需求:要求每天晚上00:00:00调用一次Log.sh
3、设计思想:项目已有执行定时任务的相关代码,只需要编写一个调用脚本文件的类即可
首先,这个类要实现名为org.quartz.Job接口;
然后,创建一个进程去执行(调用)脚本文件。
4、创建一个本机进程的两种方法: ProcessBulider.start()和Runtime.exec(),二者都返回Process子类的一个实例。该实例可以用来控制进程并获得相关信息。
Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。
5、在API写到创建进程的方法可能无法针对某些平台上的特定进程很好地工作,如shell脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin、stdout
和 stderr)操作都将通过三个流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。
因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。
6、我的理解是,由于创建的子进程没有自己的终端或控制台,就需要父进程来通过流提供子进程的输入、获得从子进程的输出,然而有些平台对输入流输出流提供的缓冲区大小有限,
如果读写子进程的输出流或输入流出现失败,则可能导致子进程阻塞,甚至产生死锁。因此,要把缓冲区读一下。
7、这个问题也在这里https://yq.aliyun.com/articles/2362说到,java进行一直等待shell返回,“原因是, shell脚本中有echo或者print输出, 导致缓冲区被用完了! 为了避免这种情况, 一定要把缓冲区读一下”。
总的来说,应该是这样的。可执行程序的输出可能比较多,而运行窗口的