从ssh注销后如何使程序继续运行? [复制]

Posted

技术标签:

【中文标题】从ssh注销后如何使程序继续运行? [复制]【英文标题】:How to make a program continue to run after log out from ssh? [duplicate] 【发布时间】:2010-10-31 13:22:28 【问题描述】:

可能重复:Prevent a background process from being stopped after closing SSH client

我有一个程序需要很长时间才能完成。 它在 ssh 上以 root 身份运行。 我希望它在我注销后继续运行,这可能吗?我该如何实现?

【问题讨论】:

nohup(1) 想法比 disown 恕我直言更好,因为 disown 是 BASH 的特定于 shell 的内置程序,而 nohup 是 coreutils 的一部分并且可能无处不在。 使用batch,例如echo myprogram its arguments | batch 【参考方案1】:

假设你有一个程序在前台运行,按 ctrl-Z,然后:

[1]+  Stopped                 myprogram
$ disown -h %1
$ bg 1
[1]+ myprogram &
$ logout

如果只有一项作业,则无需指定作业编号。只需使用disown -hbg

以上步骤说明:

你按 ctrl-Z。系统暂停正在运行的程序,显示作业编号和“已停止”消息并返回到 bash 提示符。

您输入disown -h %1 命令(在这里,我使用了1,但您将使用Stopped 消息中显示的作业编号)标记作业,因此它忽略@987654327 @ 信号(它不会因注销而停止)。

接下来,使用相同的作业号键入bg 命令;这将在后台恢复程序的运行,并显示一条消息确认。

您现在可以注销,它会继续运行..

【讨论】:

你能解释一下每一步之后到底发生了什么吗? 你按 ctrl-Z。系统暂停正在运行的程序,显示作业编号和“已停止”消息并返回到 bash 提示符。您键入“disown -h %1”命令(在这里,我使用了“1”,但您将使用“已停止”消息中显示的作业编号)标记作业,因此它忽略 SIGHUP信号(它不会因注销而停止)。接下来,使用相同的作业号键入“bg”命令。这将在后台恢复程序的运行,并显示一条消息确认。您现在可以注销,它会继续运行... ...您应该知道,当您使用“bg”命令时,结果与您在后台使用与号 (&) 运行程序相同。它不会有任何输出到标准输出,因此应该将输出写入文件(如果您不自己重定向,nohup 会将标准输出重定向到 nohup.out 或 ~/nohup.out)。 我测试了它,但不起作用..退出时退出... @ButtleButkus:你应该可以通过ps x看到它们【参考方案2】:

您应该尝试使用nohup 并在后台运行它:

nohup sleep 3600 &

【讨论】:

有没有办法让这个工作在再次登录时回到前台? 其实它默认将输出重定向到同一目录下的nohup.out文件。 @LordLoh。 Afaik,唯一可行的方法是使用tmuxscreen 这效果更好,谢谢!我只是说nohup <my program> 然后CTRL-Z + bg 然后我可以注销。您可以通过让另一个 ssh 查看top 来验证它是否仍在运行,并查看该过程是否继续进行 你也可以tail -f nohup.out实时查看输出,如果需要重启的话killPID。【参考方案3】:

我会试试screen这个程序。

【讨论】:

虽然 screen 是一个非常好的工具,但 nohup 可能更适合这项任务。仅当您要求程序具有交互性并且以后能够返回到应用程序时才需要屏幕。老实说,我经常发现自己使用屏幕的原因与上述问题完全相同。 即使是非交互式任务,很高兴看到程序完成时没有错误。在断开连接的情况下始终使用屏幕也是一种好习惯。 屏幕的替代品是tmux 这是为什么永远不应使用仅链接答案的典型代表。 我知道这是一个旧答案,但它已被标记为仅链接答案,实际上该链接已失效。是否可以扩展它以显示如何使用屏幕的简短示例,也许来自最初链接的示例(仍然可以在web.archive.org/web/20090106170543/http://www.rackaid.com/… 获得)?【参考方案4】:

在后台启动:

./long_running_process options &

并在您注销之前放弃该工作:

disown

【讨论】:

但是程序已经开始运行了.. 它会继续以 root 身份运行吗? 如果程序已经在控制台上运行,并且您可以访问它正在运行的控制台,点击“Ctrl+Z”将其发送到后台,然后取消新创建的作业。只要进程以 root 身份启动,它将继续以 root 身份运行,除非它自己放弃特权。 但是命令名为'disown',是不是说root会disown程序,程序不会继续以root身份运行? "disown" 只是为了放弃对作业的控制,它不会改变进程的权限。【参考方案5】:

你想要nohup。见http://nixcraft.com/linux-software/313-ssh-nohup-connection.html

【讨论】:

链接不再起作用,但我猜这个或多或少是一样的:cyberciti.biz/tips/…【参考方案6】:

您可以使用screen,分离并重新附加

【讨论】:

以上是关于从ssh注销后如何使程序继续运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 不间断会话(ssh关闭后如何保证程序继续运行)(nohup和screen)

如何在SSH断开后让远程服务器程序继续运行

如何在数字海洋水滴上运行进程并在注销时保持运行? [复制]

如何在关闭ssh连接的情况下,让进程继续运行?

如何在关闭ssh连接的情况下,让程序继续运行?

其中 jsonwebtoken 存储在服务器 nodejs 中。用户注销后如何使 JWT 过期