我有一个在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
}
}
答案 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来轻松完成此任务。