如何从命令行停止执行Java程序?

时间:2010-06-10 11:59:26

标签: java interrupt

我的主要领域是.Net但最近我与Java有关。我必须在Java中创建一个shell实用程序,它可以在后台运行,在指定的持续时间后读取少量数据库记录并进行进一步处理。这是一种调度程序。现在我几乎没有担心:

如何将此作为服务工作。我想通过shell脚本执行它,该实用程序应该开始运行。当然,控件应该返回到调用脚本。

其次,最终我可能想要阻止这个过程运行。怎么做到这一点?

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

请帮忙/建议吗?

5 个答案:

答案 0 :(得分:3)

我会使用调度程序或服务来运行程序。但是,如果您希望使用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程序的脚本,并在终止时恢复控制权。我很想知道是否有人有解决方案。

答案 1 :(得分:3)

我假设您正在使用Linux / Unix盒子播放您的Java程序。 要将应用程序作为守护程序运行,可以尝试

nohup java YourJavaClass &

要停止申请,您可以:

kill [psIdofYourApplication]

fg [your application job Id]
Ctrl-C

如果你想在应用程序收到'kill / stop'信号后进行一些后处理。看看addShutdownHook(Thread hook)

或sun.misc.SignalHandler

答案 2 :(得分:1)

ps ux

请参阅pid

kill pid

或者您最好提供一个停止脚本来表示应用程序,System.exit(0)

答案 3 :(得分:1)

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

答案 4 :(得分:0)

据我了解,你想要这样的东西:

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

我是对的吗?