gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:50:55 26 4
gpt4 key购买 nike

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

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

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


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

最佳答案

简而言之,您必须以特殊方式启动程序,并且您(至少)有两个选择:nohupscreen.

现在让我们讨论一下每个方法的工作原理和原理。

<小时/>

nohup

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

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

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

来自 nohup 的 man,

nohup - run a command immune to hangups, with output to a non-tty

因此,当您终止 SSH 连接时,它会向它启动的所有进程发送 SIGHUP,这会在您观察时终止它们。然而,使用 nohup,您的进程就不会受到它的影响。

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

要终止程序,您可以使用 jps 列出进程的 PID(例如 123),然后调用 杀死123。请注意,要使其正常工作,您的程序需要正确处理这种关闭(这涉及使用 Runtime.getRuntime().addShutdownHook(...) 添加关闭 Hook ,这将终止您的所有线程推出)。

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

<小时/>

屏幕

还有一个替代方案,那就是使用SCREEN。使用它,您可以启动一个外壳,该外壳也不受关闭影响,并且可以在多个连接之间共享。要使用它,请连接到您的服务器,然后:

screen -R

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

java -jar myfile.jar

要使其转到后台,只需按 ctrl+a ctrl+d。要将其恢复到前面,只需再次执行 screen -R 即可。如果您想终止程序,可以再次进入 screen session 并按 ctrl+c (如果您的 java 程序正确处理这种关闭) .

关于java - 如何停止执行计划数据库备份的守护线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15963303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com