1

我有一个在 Linux 机器上运行的简单 Java 程序,该程序基本上安排了一个重复任务,例如每小时运行一次,所以它有点像坐在那里的守护进程线程,但不完全是。我想知道如何知道程序是否仍在 Linux 中运行以及如何终止正在运行的程序?我需要找到一种方法来触发取消方法吗?或者我可以使用 Linux 命令杀死它?或者我需要编写一个停止并运行脚本?我不确定这是否是一个开放式问题,但实践中最好的方法是什么。

这是我的java代码

        public static void main(String [] args){
               ScheduledExecutorService task = 
                                 Executors.newSingleThreadScheduledExecutor();

               task.scheduleAtFixedRate(new Task(),0,1,TimeUnit.HOURS);
        }

        static class Task{
             @Override
             public void run(){
                    //do something
             }
        }
4

3 回答 3

1

有很多方法。

Google for ipc(进程间通信)。

...和/或编程cron以不时停止您的过程...

于 2012-11-13T17:45:52.237 回答
1

通过 (sun.misc.Signal) 使用信号处理程序。如果您通过在执行程序上调用 shutdown() 来获得信号处理它。

例如:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import sun.misc.Signal;
import sun.misc.SignalHandler;

public class Main {
    public static void main(String[] args) {
        final ScheduledExecutorService task = Executors
                .newSingleThreadScheduledExecutor();

        task.scheduleAtFixedRate(new Task(), 0, 1, TimeUnit.HOURS);
        SignalHandler sh = new SignalHandler() {

            @Override
            public void handle(Signal arg0) {
                task.shutdown();
            }
        };

        Signal.handle(new Signal("USR1"), sh);
    }

    static class Task implements Runnable {
        @Override
        public void run() {
            // do something
        }
    }
}
于 2012-11-13T16:46:41.543 回答
1

如何知道程序是否仍在 Linux 中运行以及如何终止程序运行?

如果您谈论的是现有代码,那么您就是 SOL,除非程序中已经内置了钩子。

实践中最好的方法是什么。

有很多方法可以做到这一点。我会使用 JMX。只需公开一个调用cancel()方法来停止计时器任务线程的 JMX 操作。有许多不同的 JMX 命令行客户端,您始终可以使用 jconsole。

如何公开 JMX 方法很大程度上取决于您使用的框架。您可以使用我的SimpleJmx 库来相当轻松地完成此任务。

于 2012-11-14T03:23:19.837 回答