在shell中运行一个命令并在关闭会话后继续运行该命令

37
我正在使用Putty连接到远程服务器。我想知道是否有任何方法可以编写我的命令,并允许它们在我关闭与Putty的会话后继续运行。这样做的原因是我不想始终开着电脑。有没有办法实现这一点? 更新解决方案 对于我的问题,最好的解决方案是使用提供的命令之一,例如nohup,因为您不必安装任何其他软件。但如果您遇到同样的问题,请使用screen,安装并使用它。它非常出色。
我选择了Norman Ramsey的答案,因为他提出了几种使用命令和screen的解决方案。但请查看其他答案,特别是PEZ的答案,然后您将了解screen能够实现什么。

重复问题:https://dev59.com/zHVC5IYBdhLWcg3wdw65 - GetFree
9个回答

91

screen! 它是自面包片以来最好的东西。(是的,我知道其他人已经建议过它了,但它太好了,整个世界都应该加入进来一起推荐。)

screen 类似于使用 VNC 或类似工具连接到 GUI 桌面,但适用于命令行窗口。你可以在同一个 screen 会话中同时打开多个 shell “窗口”。你可以做以下事情:

  1. 使用 "screen -dR" 启动 screen 会话(习惯使用 -dR)
    • 在一个窗口运行一些命令
    • 按下 CTRL-A,C 创建一个新窗口并在其中打开一个文件
    • 按下 CTRL-A,0 返回第一个窗口并在上面执行刚编辑过的文件的某个命令
    • CTRL-A,1 返回到你的 vim 会话
    • CTRL-A,C 再创建一个新窗口,也许执行 "sudo -su" (因为你需要完全的 root shell)
    • CTRL-A,0 并启动一个后台进程
    • CTRL-A,C 创建另一个新窗口,用 "tail -f" 命令查看该后台进程的日志
    • CTRL-A,d 断开你的 screen,然后 CTRL-D 断开服务器连接
    • 去度假三周
    • 再次登录服务器,使用 "screen -dR" 连接到你先前存在的 screen 会话
    • 使用 CTRL-A,3 检查第四个窗口中的日志(就像你一直在那里观察一样)
    • CTRL-A, 1可以恢复vim的会话状态
    • 你现在已经开始明白了吧? =)

这就像魔法一样。我使用screen已经很长时间了,但我仍然对它的强大感到惊叹。

编辑: 想提一下还有tmux。非常类似于screen,但有一些独特的功能,其中最突出的是分割窗口。


2
我使用 screen -xRR 命令来启动/加入我的屏幕会话。 - jfs
2
J.F.,假设我很懒,不想做“man screen”。你能告诉我们为什么要使用-xRR吗? - PEZ
我同意。屏幕规则。但是默认的命令键不是“CTRL-a”吗?这意味着您上面的示例对于新用户无效,对吗? - matli
谢谢。我有点冲动了。=)现在已经修复了。 - PEZ
你也可以在 screen 中分割窗口。 - niutech

31

nohupdisownscreen 都是很好的工具,但 screen 是最好的,因为它可以让你断开与远程服务器的连接,保持所有进程运行,并在之后重新连接以查看发生了什么。使用 nohupdisown 时,你无法恢复交互。


10

建议使用GNU Screen。它能够让你同时打开多个shell,当你断开与运行中的shell(例如关闭Putty会话)后,它们仍然会继续运行。


屏幕也很好,因为它可以处理意外和有目的的断开连接。每当我使用不稳定的连接时,我都会使用它。 - Tim Whitcomb

9
你需要的是nohup。请参考Wiki链接了解如何使用它。

6

屏幕 是最好的。

尝试:

screen -dmS "MyTail" tail -f /var/log/syslog 

这个命令可以在后台启动。

使用 screen -r 命令来列出,或者使用 screen -r Mytail 命令进入会话。

如果多个用户需要访问同一个会话,则使用:screen -rx MyTail 命令,这样两个或更多的用户就可以共享会话了。


有没有一种方法可以做到这一点,使屏幕会话不会因为程序结束而结束? - meawoppl

4

对我来说行之有效的一种方式是使用 at

at 的工作方式类似于 cron,但只用于一次性任务。我今天使用它下载了一个大文件,而无需保持我的会话活动。

例如:

$ at 23:55
at> wget http://file.to.download.com/bigfile.iso
at> ^D  

你在未来某个时间通过at命令行工具来设置指定时间运行命令,并输入要运行的命令,最后按下ctrl+d。你可以退出会话,它将在指定时间运行命令。更多关于at的信息,请参考Wikipedia

4

如果您无法使用 screen (例如,因为您的SSH会话正在被程序驱动),您也可以使用 daemonize 将程序作为守护进程运行。


1
./command & disown

0
ssh localhost && ./command && exit

2
如果你要回答一个已经有8个其他答案的5年前的问题,你应该尽量让它成为一个非常好的答案,并加以解释...而不仅仅是一句话。 - Frazz
1
啊,好的,我没意识到那个问题太旧了 :/ - totten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接