gpt4 book ai didi

linux - SSH:防止标准输出断开连接

转载 作者:IT王子 更新时间:2023-10-29 00:32:08 33 4
gpt4 key购买 nike

我的服务器部署脚本通过 SSH 触发一个长时间运行的进程,如下所示:

ssh host 'install.sh'

由于我家里的互联网连接不是最好的,所以在 install.sh 运行时有时会断开连接。 (这很容易通过关闭终端窗口来模拟。)我真的希望 install.sh 脚本在这些情况下继续运行,这样我就不会因为 apt 中断而结束-get 进程和类似的麻烦。

install.sh 被杀死的原因似乎是当 SSH session 被拉出时 stdout 和 stderr 被关闭,因此写入它们失败。 (这不是 SIGHUP 的问题,顺便说一句——使用 nohup 没有区别。)如果我将 touch ~/1 && echo this fails && touch ~/2 放入 install.sh,只创建~/1

因此运行 ssh host 'install.sh &> install.out' 解决了问题,但随后我丢失了所有“实时”进度和错误输出。

所以我的问题是:通过 SSH 运行进程的简单/惯用方法是什么,这样它就不会在 SSH 死机时崩溃,但我仍然可以看到它运行时的输出?


我尝试过的解决方案:

  • 当我手动运行时,我会使用 screen 来处理这种情况,但我认为它在这里没有多大帮助,因为我需要运行 install。 sh 自动从 shell 脚本。屏幕似乎是为交互使用而设计的(它提示“必须连接到终端。”)。

  • 使用 install.sh 2>&1 | tee install.out 也没有帮助(愚蠢的我认为它可能)。

  • 您可以将 stdout/stderr 重定向到 install.out,然后 tail -f。以下代码片段实际有效:

    touch install.out &&  # so tail does not bark (race condition)
    (install.sh < /dev/null &> install.out &
    tail --pid "$!" -F install.out)

    但肯定有一种不那么尴尬的方法来做同样的事情吗?

最佳答案

尝试使用屏幕:

screen ./install.sh    

如果您的 ssh session 中断,您可以简单地通过另一个 ssh 连接重新连接到该 session :

screen -x

您可以使用 -t 开关为您的 ssh session 提供一个终端:

ssh -t server screen ./install.sh

关于linux - SSH:防止标准输出断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470884/

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