2010-06-10 150 views
7

我的主要领域是.Net,但最近我得到了一些与Java有关的东西。我必须在Java中创建一个可以在后台运行的shell实用程序,在指定的持续时间后读取少量数据库记录并进行进一步处理。这是一种调度器。现在我有几个担心:如何停止从命令行执行Java程序?

如何使这项工作作为服务。我想通过一个shell脚本来执行它,并且该实用程序应该开始运行。当然,控制应该回到调用脚本。

其次,最终我可能想停止运行这个过程。如何实现这一目标?

我明白这些都是基本问题,但我真的不知道从哪里开始,哪些选项最适合我。

任何帮助/建议吗?

+0

@danben当然,会做...感谢 – Aakash 2010-06-10 15:55:18

回答

2

我会去使用调度程序或服务来运行程序。但是,如果你想使用一个bat文件,并做到这一点编程,我提出了以下可能的方法:

在Java程序中,你可以得到PID程序,然后将其写入文件:

public static void writePID(String fileLocation) throws IOException 
{ 
    // Use the engine management bean in java to find out the pid 
    // and to write to a file 
    if (fileLocation.length() == 0) 
    { 
     fileLocation = DEFAULT_PID_FILE; 
    }  
    String pid = ManagementFactory.getRuntimeMXBean().getName(); 
    if (pid.indexOf("@") != -1) 
    { 
     pid = pid.substring(0, pid.indexOf("@")); 
    }            
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileLocation)); 
    writer.write(pid); 
    writer.newLine(); 
    writer.flush(); 
    writer.close();      
} 

然后,您可以编写一个停止.bat文件,该文件将在Windows中终止正在运行的程序。你可以这样做:

setlocal 
IF EXIST app.pid FOR /F %%i in ('type app.pid') do TASKKILL /F /PID %%i 
IF EXIST app.pid DEL app.pid 
endlocal 

当然,app.pid是由上面的Java方法编写的文件。

我不知道你将如何编写一个脚本来启动一个Java程序,并恢复终止控制。我想知道是否有人为此提供解决方案。

+0

这是否意味着我可能必须编写另一个Java应用程序来读取该文件并终止正在运行的进程? – Aakash 2010-06-11 08:28:51

+0

不,.bat文件是会损害您的进程的位。这是一个VBScript,是杀死正在运行的应用程序。 如果你正在* nix上运行这个,你可以编写一个shell脚本,它可以执行这个脚本。一样的东西。 – Luhar 2010-06-11 11:59:41

1
ps ux 

看到pid

kill pid 

或者你最好提供信号的应用程序,它确实System.exit(0)

+0

只要他不做类似数据库交易的事情,杀死pid就没问题。如果他有数据库事务处理,可能需要做更多的事情。 – bwawok 2010-06-10 12:10:17

+0

@bwawok你是对的。我在那里做数据库工作。 – Aakash 2010-06-10 15:57:18

1

你没有指定平台停止脚本。如果在Windows上,您应该考虑与服务控制集成以创建Windows服务。 http://en.wikipedia.org/wiki/Windows_service。一旦实现了服务挂钩,就可以通过服务控制GUI或使用命令行中的net stop MyService语法来启动和停止该服务。

+0

我想在Unix平台上做到这一点。谢谢 – Aakash 2010-06-10 15:56:10

2

我假设你正在用Linux/Unix机器玩你的java程序。 运行应用程序作为一个守护进程,你可以尝试

nohup java YourJavaClass & 

要停止你的应用程序,您可以:

kill [psIdofYourApplication] 

fg [your application job Id] 
Ctrl-C 

如果你想要做一些后处理应用程序收到'kill/stop'信号后。退房addShutdownHook(Thread hook)

或者sun.misc.SignalHandler

0

据我了解,你想是这样的:

if (System.in.avaliable() > 0) { 
    in = new BufferedReader(new InputStreamReader(System.in); 
    String InLine = in.readLine(); 
    ... 
} 

我说得对不对?