【问题标题】:Run a command in a shell and keep running the command when you close the session在 shell 中运行命令并在关闭会话时继续运行该命令
【发布时间】:2010-09-30 16:46:05
【问题描述】:

我正在使用 Putty 连接到远程服务器。我想知道的是,在我关闭与 Putty 的会话后,是否有任何方法可以编写我的命令并允许它们继续运行。这样做的原因是我不想让电脑一直开着。有没有办法做到这一点?

更新解决方案

对于我提出的问题,最好的解决方案是使用提供的命令之一,例如 nohup,因为您不必安装任何其他软件。但是,如果您遇到同样的问题,请安装并使用它。太棒了。

我选择了 Norman Ramsey 的答案作为最喜欢的答案,因为使用命令和 screen 提出了几种解决方案。但是请检查其他答案,特别是 PEZ 的答案,然后您就会了解屏幕能够做什么。

【问题讨论】:

标签: linux shell command


【解决方案1】:

屏幕!这是自切片面包以来最好的东西。 (是的,我知道其他人已经提出了建议,但这太好了,全世界都应该加入并提出建议。)

screen 就像,像,嗯......就像使用 VNC 或类似的东西连接到 GUI destop,但用于命令 shell 窗口。您可以在同一个屏幕会话中同时打开多个外壳“窗口”。您可以执行以下操作:

  1. 使用“screen -dR”启动屏幕会话(习惯使用 -dR)
    • 在一个窗口中运行一些命令
    • CTRL-A,C 创建一个新窗口在 vim 中打开一个文件
    • 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 断开屏幕然后 CTRL-D 断开从服务器
    • 请假三周
    • 再次登录服务器并发出“screen -dR”以连接到您现有的屏幕会话
    • CTRL-A3检查第四个窗口中的日志(就像你一直在那里看着它一样时间)
    • CTRL-A, 1 再次启动该 vim 会话
    • 我猜你现在开始看照片了? =)

这就像魔术。我使用屏幕的时间已经超过了我的记忆,但我仍然对它的出色表现感到惊讶。

EDIT:只想提一下现在还有 tmux。很像screen,但有一些独特的功能,分割窗口是最突出的。

【讨论】:

  • 我使用 screen -xRR 开始/加入我的屏幕会话。
  • J.F.假装我很懒,不想做“人屏”。你能告诉我们为什么 -xRR 吗?
  • 我同意。屏幕规则。但是默认的命令键不是“CTRL-a”,这意味着您上面的示例不适用于新用户吗?
  • 谢谢。我刚刚分心了。 =) 现在已修复。
  • screen也可以拆分窗口。
【解决方案2】:

nohupdisownscreen 都很好,但 screen 是最好的,因为与其他两个不同,screen 允许您断开与远程服务器的连接,保持一切运行,然后重新连接稍后看看发生了什么。使用nohupdisown,您将无法继续互动。

【讨论】:

    【解决方案3】:

    尝试使用GNU Screen。它允许您一次打开多个 shell。您可以断开与那些正在运行的 shell 的连接(即关闭与 Putty 的会话),他们将继续做他们的事情。

    【讨论】:

    • 屏幕也很好,因为它可以处理意外和故意断开连接。每当我处理不稳定的连接时,我都会使用它。
    【解决方案4】:

    你要找的是nohup

    查看 wiki 链接了解如何使用它。

    【讨论】:

      【解决方案5】:

      screen 是最好的。

      试试:

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

      这个在后台启动命令。

      使用screen -r 列出,或screen -r Mytail 进入会话。

      如果更多用户需要访问同一个会话,请使用:screen -rx MyTail,两个或多个用户共享会话。

      【讨论】:

      • 有没有办法做到这一点,屏幕会话不会因为程序结束而结束?
      【解决方案6】:

      如果您不能使用 screen(例如,因为您的 SSH 会话是由程序驱动的),您也可以使用 daemonize 将程序作为守护程序运行。

      【讨论】:

        【解决方案7】:

        一种适合我的方法是at

        at 像 cron 一样工作,但用于一次性工作。我今天用它来下载一个大文件,而不必让我的会话保持活动状态。

        例如:

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

        你通过at 一次(在未来)它会给你一个提示。您输入当时要运行的命令,然后按 ctrl+d。您可以退出会话,它会在指定的时间运行命令。

        Wikipedia 有更多关于at 的信息。

        【讨论】:

          【解决方案8】:
          ./command & disown
          

          【讨论】:

            【解决方案9】:
            ssh localhost && ./command && exit
            

            【讨论】:

            • 如果您要回答一个已经有 8 个其他答案的 5 年前的问题,您真的应该尝试使它成为一个非常好的答案,并附上解释......而不仅仅是一个单行字。
            • 啊,好吧,我没有意识到这个问题太老了:/
            猜你喜欢
            • 2022-08-24
            • 2023-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-07
            • 2014-08-29
            • 1970-01-01
            相关资源
            最近更新 更多