- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个非常简单的命令行程序,它使用 mysqldump 以指定的时间间隔转储数据。
我希望它在运行程序并断开 putty ssh 连接后运行。
但是一旦我退出 ssh 连接,程序就会关闭。
我认为即使在使用守护进程线程与 ssh 断开连接后我也可以让我的程序运行,但我担心无法找到并停止不必要的重复守护进程线程。
我描述的场景是...
1.我使用putty登录服务器。
2.开启自动备份程序。
3.我退出putty连接。
---守护进程正在运行
4. 希望当我再次登录服务器时,我有办法在需要时停止自动备份程序。
Cron 作业和 DBMS 特定方法不在我的选择范围内。
我想了解如何完成上述工作,并在适合的情况下使用它,而不仅仅是数据库备份。
有什么好主意吗? :)
最佳答案
简而言之,您必须以特殊方式启动程序,并且您(至少)有两个选择:nohup
或 screen
.
现在让我们讨论一下每个方法的工作原理和原理。
<小时/>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/
我的程序有问题。 我有一个比较两个字符串的条件: (if (eq? (exp1) (exp2))) 当 exp1 给我一个字符串,exp2 给我一个字符串。可以肯定的是,当我更改“eq?”时到“=”,
我们有多种主要使用 GWT 开发的产品,目前由我们的最终客户使用。 想知道 GWT 的路线图。我得到了一些非官方的更新,谷歌正在将 GWT 中开发的产品转移到其他一些新技术。这是真的吗? GWT 的长
我希望每 15 分钟定期构建一次。我在网上看过,我正在使用这个时间表:*/15 * * * * Jenkins 告诉我使用 H/15 * * * * 来平均分配负载而不是 */15 * * * * 有
所以我正试图在 Scheme 中找出整个 call/cc 的东西。下面是我正在使用的代码: (+ 1 (call/cc (lambda (k) (if (number? k)
所以我正试图在 Scheme 中找出整个 call/cc 的东西。下面是我正在使用的代码: (+ 1 (call/cc (lambda (k) (if (number? k)
我们有一个 Azure WebJob,计划在 UTC 每天上午 8:00 运行(CRON - 0 00 08 * * *)。大多数时候它都会正确触发,但有时会触发两次(第二次运行)第一次运行后约 10
我是 Terraform 的新手。我正在尝试通过 azure 管道创建一个简单的存储帐户,但是当我运行我的管道时,我收到错误“太多命令行参数”。我很震惊,我不知道自己做错了什么。有人可以帮忙吗。 这是
我想在某些逻辑中间停止芭蕾舞 Actor 程序。如何使用代码停止 ballerina 中正在运行的程序?我正在寻找相当于 java 中的 System.exit(0) 的东西。 最佳答案 我相信您正在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
我们有一个 Azure WebJob,计划在 UTC 每天上午 8:00 运行(CRON - 0 00 08 * * *)。大多数时候它都会正确触发,但有时会触发两次(第二次运行)第一次运行后约 10
我是 Terraform 的新手。我正在尝试通过 azure 管道创建一个简单的存储帐户,但是当我运行我的管道时,我收到错误“太多命令行参数”。我很震惊,我不知道自己做错了什么。有人可以帮忙吗。 这是
我正在浏览 htdp 并在一开始的某个地方发现了这个:- Explain why the following sentences are illegal definitions: 1. (define
我正在使用 Laravel 开发成员(member)门户。 成员(member)资格有不同的类别,例如1) 单人2) 成人3) 家庭以及不同价格的所有类型。 我有一个 plans 表和 plans_s
我使用 DreamHost 作为我的网站的服务器,并且我尝试每天、每周和每月执行某个 MySQL 查询来更改我的网站的数据库。我开始在本地主机上使用事件调度程序,然后我发现我无法在 DreamHost
这周我的 crontab 作业发生了一个问题。 设置如下,每两周正常运行一次,直到现在。 10 06 * * 1 test $(($(date +\%W)\%2)) -eq 0 && echo 'te
编写了一个简单的脚本,它将在日志文件中写入日期时间戳,并且每次运行该脚本时,它都会附加到该日志文件中。 #!/bin/sh echo $(date) >> log.txt 当我尝试每 1 分钟安排一次
我对 PIPE 的了解是它用于单向通信,它有助于在两个相关进程之间进行通信。我从一本书中得到了下面的 PIPE 编程代码示例。我正在尝试使用 printf 理解代码并在代码的每一行之后打印出所有点。但
代码如下: (define make-simple-sv-num (lambda (delare) (let ((tal (random-from-to 100000 1000000)))
我目前正在使用“How To Design Programs”——使用 Scheme/Racket;我在 Scheme 的 R5RS 版本中遇到了一个非常奇特的功能。 在进行简单的减法时,尽管使用的是
我想确定时间表的详细信息。例如: 我有一个事件的时间表:event.schedule "Every 3 months on the 10th day of the month" 由哈希表示: {
我是一名优秀的程序员,十分优秀!