如何停止执行计划数据库备份的守护程序线程?

时间:2013-04-12 04:50:13

标签: java multithreading daemon start-stop-daemon

我编写了一个非常简单的命令行程序,它使用mysqldump以指定的间隔转储数据。
我希望它在运行程序后运行并断开putty ssh连接。
但是一旦我退出ssh连接,程序就会关闭。

我想即使我通过使用守护程序线程从ssh断开连接后也可以运行我的程序,但是我担心无法找到并停止不必要的重复守护程序线程。

我要描述的情景是......
1.我使用putty登录服务器 2.打开自动备份程序 我退出了腻子连接 ---守护进程正在运行
4.希望当我再次登录服务器时,如果需要,我可以停止自动备份程序。


Cron作业和DBMS特定方法不在我的选择范围内。
我想学习如何完成上述工作并在任何情况下使用它,而不仅仅是数据库备份。
有什么好主意吗? :)

2 个答案:

答案 0 :(得分:3)

简而言之,您必须以特殊方式启动您的计划,并且您(至少)有两个选项:nohupscreen

现在让我们讨论每个人工作的原因和方式。


nohup

Java的守护程序线程不是您正在寻找的,它们与此问题无关。您可以使用普通线程(甚至是单线程java程序)。您只需要更改启动Java程序的方式。

我有许多可执行jar在一堆服务器上作为“守护进程”运行,我制作了一个简单的启动脚本来准备环境,并且可以在不停止的情况下终止SSH连接。主要部分是如何调用JVM:使用 nohup

nohup java -jar myfile.jar > stdout.log &

来自nohup的男人,

  

nohup - 运行一个免于挂断的命令,输出为非tty

因此,当您终止SSH连接时,它会将SIGHUP发送到它启动的所有进程,这会在您观察时终止它们。但是,使用nohup,您的流程可以免受它的影响。

另外,请注意我将标准输出重定向到名为stdout.log的文件。这样做是为了让您可以看到程序写入STDOUT的任何内容(通常是一些对调试有用的日志信息)。

要终止您的计划,您可以使用jps列出流程的PID(说明为123),然后拨打kill 123。请注意,要使其正常工作,您的程序需要正确处理这种关闭(这涉及添加一个带有Runtime.getRuntime().addShutdownHook(...)的关闭钩子,它将终止您启动的所有线程。)

如果由于某种原因(一个错误,或者您没有实现正常关闭),程序将在发出kill命令(将进程发送SIGTERM)后终止。 ,您可以使用SIGKILL更改发送到kill -9 123的信号,这将简单地破坏该过程。请注意,这可能与电源故障一样危险(即,假设您位于try的{​​{1}}块的中间 - 您的try {} finally {}块将不会执行!)。


finally

有一种替代方法,即使用screen。有了它,你可以启动一个也不受关机影响的shell,你可以在很多连接中共享。要使用它,请连接到您的服务器,然后:

SCREEN

将启动一个新shell,您可以正常运行java程序:

screen -R

要使其转到后台,只需按java -jar myfile.jar 即可。要将其恢复到前面,请再次执行ctrl+a ctrl+d。如果您希望终止程序,可以再次进入screen -R会话并按screen(如果您的java程序正确处理此类关闭)。

答案 1 :(得分:1)

按照从最不复杂到最复杂的顺序,计划任务的两种可能性是TimerTaskQuartz Scheduler。两者都提供取消/删除预定作业的选项。