敬的世界

常用链接

统计

最新评论

java 調用 LINUX service ntpd stop

If you read about the Javadoc of the Process class, you will discover something
very weird and unexpected. The following is the context of the Javadoc for Process.
In effect, you should be very clear of this limitation before you think of using
the Process JDK. Ok, here it is:


The methods that create processes may not work well for special processes on certain
native platforms, such as native windowing processes, daemon processes, Win16/DOS
processes on Microsoft Windows, or shell scripts.

The created subprocess does not have its own terminal or console. All its standard
io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process
through three streams (getOutputStream(), getInputStream(), getErrorStream()).
...


So basically, Process does not guarantee your daemon process to work properly. This
is horrifying when I first read about this Javadoc. However, I have changed my
mind after using Process for a while. My experience tells me that usually Process
cannot be working at the following circumstances: (assuming we are in Linux O.S.)

- to execute shell built-in commands e.g. "cd" or "alias"
- to redirect output from the executed application,
- This method will NOT expand filesystem wildcards e.g. "*".

Taking all these things into consideration, let's see what we can do to improve
your code.

First of all, Process has its standard outputstream, and its standard errorstream
(but don't try to redirect them, as it will *not* work)


Process proc = Runtime.getRuntime().exec(command);

// Create thread for reading inputStream (process' stdout)
proc.getInputStream();

// Create thread for reading errorStream (process' stderr)
proc.getErrorStream()


Another fact I can see why your ntpd has not stopped is maybe you havn't given
enough time for the Process to be executed completely.

Consider adding the following code into your program:


// this will wait for the process to end!!! I think it is very important
// not to interfere with other process in the O.S.
int returnCode = proc.waitFor();

String msg = "Shell command [" + commandString + "] result [";
if (returnCode == 0)
{
msg += "SUCCEEDED";
}
else
{
msg = msg + "FAILED - ret code: " + returnCode;
}
msg += "]";



Then you can print the msg to the standard output or simply trace it into your log.
You shall see the error if occurs.

Another thing I can suggest you to do is fully read the Process Javadoc and any related documents about using Process.

Hope these help.


import java.io.*;
public chass shell{
public static void main(String [] args)throws Exception{
try

{

process = Runtime.getRuntime().exec ("bin/sh service ntpd stop");

InputStreamReader ir=newInputStreamReader(process.getInputStream());

LineNumberReader input = new LineNumberReader (ir);


String line;

while ((line = input.readLine ()) != null)

System.out.println(line);

}

catch (java.io.IOException e){

System.err.println ("IOException " + e.getMessage());

}
}
 

来自 :http://www.cjsdn.net/post/view?bid=1&id=196586

posted on 2009-04-26 02:38 picture talk 阅读(410) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: