我的服务器部署脚本通过SSH触发长时间运行的进程,如下所示:
ssh host 'install.sh'
由于我在家中的互联网连接不是最好的,所以在install.sh运行时,我有时可能会断开连接。 (这很容易通过closuresterminal窗口来模拟)。我真的很想让install.sh脚本在这种情况下继续运行,这样我就不会因为中断的apt-get进程和类似的麻烦而结束运行。
为什么install.sh被杀死的原因似乎是,当SSH会话被抽出时stdout和stderr被closures,所以写入失败。 (这不是SIGHUP的问题,顺便说一下,使用nohup并没有什么区别。)如果我把touch ~/1 && echo this fails && touch ~/2到install.sh ,只会创build~/1 。
所以运行ssh host 'install.sh &> install.out'解决了这个问题,但是后来我失去了“实时”进程和错误输出。
UNIX套接字编程:获取C客户端连接到Python服务器的问题
SED – 删除string,然后是LineFeed( n)
所以我的问题是:什么是通过SSH运行一个进程的简单/惯用的方式,以便它不会崩溃,如果SSH死亡,但我仍然可以看到输出运行?
我试过的解决scheme:
当我手动运行东西时,我使用screen来处理这种情况,但是我不认为这会有很大的帮助,因为我需要从shell脚本自动运行install.sh 。 屏幕似乎是交互使用(它抱怨“必须连接到terminal”)。
使用install.sh 2>&1 | tee install.out install.sh 2>&1 | tee install.out也没有帮助(愚蠢的我认为它可能)。
您可以将stdout / stderrredirect到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)
但是,做同样的事情肯定不会太尴尬吗?
c#mono interop – 无法识别的configuration部分dllmap
使用ACL权限将文件迁移到其他服务器
Java程序运行一段时间后变慢了
尝试使用屏幕:
screen ./install.sh
如果您的ssh会话被中断,您可以通过另一个ssh连接重新连接到会话:
screen -x
您可以使用-t开关为您的ssh会话提供一个终端:
ssh -t server screen ./install.sh
install.sh 2>&1 | tee install.out
如果唯一的问题是没有得到stderr。 你没有确切地说明为什么发球台是不能接受的。 你可能需要其他nohup / stdin的调整。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。