如何在Linux中杀死并停止在应用程序外运行的TimerTask

时间:2012-11-13 16:37:14

标签: java linux multithreading scheduled-tasks daemon

我有一个在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
             }
        }

3 个答案:

答案 0 :(得分:1)

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

EG:

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
        }
    }
}

答案 1 :(得分:1)

有很多方法。

Google ipc(进程间通信)。

...和/或对cron进行编程以不时停止您的流程...

答案 2 :(得分:1)

  

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

如果您正在谈论现有代码,那么除非已经在程序中内置了钩子,否则您将是SOL。

  

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

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

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