本地重启/睡眠后,远程机器tmux会话内脚本停止运行求助
问题根源:你搞反了tmux的运行位置!
哈哈,我一眼就看出问题所在了——你是在本地Mac的tmux会话里打开SSH连接到远程机器,然后在远程跑脚本。这种情况下,本地tmux只是帮你保存了本地的SSH窗口状态,但远程的脚本进程其实是挂在SSH连接上的。一旦本地睡眠、重启,SSH连接会直接断开,远程服务器会把依附在这个连接上的所有进程都杀掉,脚本自然就停了。
正确的操作姿势:把tmux跑在远程机器上!
这才是tmux用来保持远程进程存活的正确打开方式,步骤如下:
直接在本地终端SSH登录远程机器:
ssh user@remote-server-ip(不用先开本地tmux,当然开了也没关系,但核心是远程端要开tmux)
在远程机器的终端里启动tmux会话:
tmux new -s my-script-session # 给会话起个好记的名字,方便后续连接在远程的tmux会话里启动你的脚本:
./your-long-running-script.sh分离远程的tmux会话:按
Ctrl+b d,此时你会回到本地的SSH终端,然后可以直接关闭SSH连接,甚至本地睡眠、重启都无所谓——脚本会一直在远程的tmux会话里跑着。后续重新连接:先SSH登录远程机器,然后执行:
tmux attach -t my-script-session就能回到之前的会话,看到脚本的运行状态了。
额外优化:防止SSH连接被远程服务器主动断开
有些服务器会因为长时间无交互断开SSH连接,你可以在本地Mac的~/.ssh/config里加个配置,让SSH定期发心跳包:
Host * ServerAliveInterval 60 ServerAliveCountMax 3
这样每60秒发一次心跳,连续3次没回应才断开,能大大降低连接被主动断开的概率。
补个小提醒:如果已经在本地tmux里跑了SSH,怎么补救?
要是你已经在本地tmux里开了SSH,不想重新来,可以在当前的远程SSH会话里直接启动tmux:
- 在远程终端里启动tmux会话:
tmux new -s rescue-session - 把你的脚本在这个远程tmux会话里重新启动就行(如果脚本已经在跑,想要把进程移过来需要装
reptyr工具,步骤稍复杂,不如直接重启脚本省心)
内容的提问来源于stack exchange,提问作者MoreScratch
相关产品推荐
相关产品推荐

