8

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

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

其次,最终我可能想停止这个过程的运行。如何做到这一点?

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

请问有什么帮助/建议吗?

4

5 回答 5

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 程序并恢复对终止的控制的脚本。我很想看看是否有人对此有解决方案。

于 2010-06-10T14:52:35.987 回答
3

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

nohup java YourJavaClass &

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

kill [psIdofYourApplication]

或者

fg [your application job Id]
Ctrl-C

如果您想在应用程序接收到“kill/stop”信号后进行一些后处理。查看addShutdownHook(线程挂钩)

或 sun.misc.SignalHandler

于 2010-06-10T15:33:01.257 回答
1
ps ux

pid

kill pid

或者你最好提供一个停止脚本来通知应用程序,它确实System.exit(0)

于 2010-06-10T12:08:13.730 回答
1

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

于 2010-06-10T12:15:06.013 回答
0

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

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

我对吗?

于 2010-06-10T16:49:46.793 回答