最近在写一个小程序,作为linux的守护进程周期性的执行脚本。
这个守护进程写完之后,又写了一个控制台,用控制台来对守护进程进行开启,关闭。。
在写开启时,想用Runtime 和Process 来执行命令来开启守护进程,代码是这样的
Process process = null;
try {
process = Runtime.getRuntime().exec("nohup java myDaemon configure.xml &");
process.waitFor();
}exception(Exception e){
e.printStackTrace();
}
然而,这并没有什么卵用。 。根本没有开启,于是上网查了一些资料,发现很多人有这种困扰,
有人建议用反射来解决问题。发现这并不能后台开启我的进程。
后来试了一下用ProcessBuilder 可以解决。。
ProcessBuilder pb = new ProcessBuilder("nohup","java","myDaemon","configure.xml","&");
pb.start();
}<pre name="code" class="java">exception(Exception e){
e.printStackTrace();
这样可以开启我的进程了!!
但是我还是不明白这到底是为什么??
public static String runShell(String cmd) throws Exception {
StringBuilder result = new StringBuilder();
Process process = null;
Buffer
背景:java 支持多线程,这是绝大多数程序都满足的必要条件,因为多线程个可以增加程序的“吞吐量”,提高用户对软件的流畅性体验。
同时,java程序也支持开启新的进程,或者叫做java调用外部应用程序。这里的实现方式java提供了两个类:Process、RunTime。
这些类之间的关系:
1.通过ProcessBuilder...
#! /bin/bash
PROCESS=`ps -ef|grep java|grep -v grep|awk '{ print $2}'`
echo "kill the process [$PROCESS]"
kill -9 $...
要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦;另一种方法是仍然用普通方法编程,然后用nohup命令启动程序:
nohup <程序名> &
则控制台logout后,进程仍然继续运行,起到守护进程的作用(虽然它不是严格意义上的守护进程)。
使用nohup命令后,原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用,实现了完整的守