Java 如何在Linux中终止和停止在应用程序外部运行的TimerTask

Java 如何在Linux中终止和停止在应用程序外部运行的TimerTask,java,linux,multithreading,scheduled-tasks,daemon,Java,Linux,Multithreading,Scheduled Tasks,Daemon,我有一个简单的Java程序在Linux机器中运行,该程序基本上安排了一个循环任务,例如每小时运行一次,所以它有点像一个守护进程线程,但并不完全如此。我想知道如何知道程序是否仍在Linux中运行,以及如何终止程序的运行?我是否需要找到触发cancel方法的方法?或者我可以用Linux命令杀死它?或者我需要写一个停止运行脚本?我不确定这是否是一个开放性的问题,但实践中最好的方法是什么 这是我的java代码 public static void main(String [] args)

我有一个简单的Java程序在Linux机器中运行,该程序基本上安排了一个循环任务,例如每小时运行一次,所以它有点像一个守护进程线程,但并不完全如此。我想知道如何知道程序是否仍在Linux中运行,以及如何终止程序的运行?我是否需要找到触发cancel方法的方法?或者我可以用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
             }
        }
通过(sun.misc.signal)使用信号处理器。如果收到信号,请通过调用执行器上的shutdown()来处理它

例如:

有很多方法

谷歌搜索
ipc
(进程间通信)

。。。和/或对
cron
进行编程,以不时停止进程

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

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

实践中最好的方法是什么

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


如何公开JMX方法在很大程度上取决于您使用的框架。你可以用我的方法来完成这件事。

如果你说的是正确的,你可以把它从命令行中停止,CTRL+C(不是Linux用户-MAC)。我怀疑如果使用CTRL+C会不会是坏的,因为这会马上把它杀死,如果我们中间有一些任务,会发生什么?你丢失了这些信息吗?没有,除了在进行IO/网络通信等时。我相信你甚至可以收听该事件,以便在被杀之前进行清理。你如何将侦听器添加到其中。你能提供一些细节吗?我认为应该这样做:你是如何做到的?这会是一个单独的线程在单独的应用程序中运行吗?处理USR1并在外部运行“kill-USR1”,这样USR1可以是您想要的任何字符串?一旦我们有了Signal.handle(新信号(“USR1”),sh);我们可以简单地运行Lunix命令来杀死它,对吗?不,在类Unix系统中有一组可用的信号(例如USR1、USR2、PIPE、CHLD等等)。请看一看,以获得更好的解释
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
        }
    }
}