0

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

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

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


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

4

2 回答 2

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命令(发送进程 a SIGTERM)后不会终止,您可以更改它发送到的信号SIGKILLwith kill -9 123,这将简单地破坏进程。请注意,这可能与电源故障一样危险(即,假设您在trya 块的中间try {} finally {}——您的finally块将不会执行!)。


screen

有一个替代方案,即使用SCREEN. 使用它,您可以启动一个不受关闭影响的 shell,并且可以在许多连接之间共享。要使用它,请连接到您的服务器,然后:

screen -R

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

java -jar myfile.jar

要使其进入后台,只需按ctrl+a ctrl+d。要将其带回前面,只需screen -R再次执行即可。如果你想终止你的程序,你可以通过screen再次进入会话并按下来完成ctrl+c(如果你的java程序正确地处理了这种关闭)。

于 2013-04-12T04:54:15.667 回答
1

TimerTaskQuartz Scheduler是计划任务的两种可能性,从最简单到最复杂。两者都提供取消/删除计划作业的选项。

于 2013-04-12T04:59:37.680 回答