如何在远程脚本退出tailf命令后保持PuTTY会话不关闭
我之前也碰到过一模一样的问题,折腾了好一会儿才搞明白根源:Putty的-m参数是用来批量执行命令的,当脚本里的所有命令执行完毕(包括你按Ctrl+C终止tailf),Putty默认就会直接关闭会话——哪怕你在最后加了/bin/bash也没用,因为这个bash是在非交互式环境下启动的,执行完就会自动退出,不会停在那里给你交互。
给你几个亲测有效的解决方案:
方案1:直接在Putty命令行串联命令,强制启动交互式bash
放弃-m参数,把命令直接写到Putty的启动命令里,用分号串联,并且给bash加上-i参数(交互式启动):
putty.exe -ssh user@srv -pw password -t "tailf /dir/log; /bin/bash -i"
-i会让bash进入交互式模式,这样即使tailf退出,bash会接管终端,保持会话处于活跃状态,不会自动关闭。
方案2:修改命令文件,用exec让bash替换当前进程
如果一定要保留-m参数的话,修改你的Execute_Command_File,把最后一行改成:
tailf /dir/log; exec /bin/bash -i
exec的作用是让bash直接替换当前的shell进程,而不是启动一个子进程。这样Putty会一直绑定这个交互式bash进程,直到你主动输入exit退出,终端才会关闭。
方案3:用screen/tmux包裹tailf(进阶方案)
如果你的服务器上安装了screen或者tmux,这也是个非常好用的办法:
putty.exe -ssh user@srv -pw password -t "screen -dmS tail_log tailf /dir/log; screen -r tail_log"
tailf会在后台的screen会话里运行,你按Ctrl+C退出tailf后,screen会话依然存在,终端不会关闭,你可以继续在里面执行其他命令,甚至重新启动tailf都很方便。
补充说明:为什么之前加/bin/bash无效?
当你用-m参数执行命令文件时,Putty会启动一个非交互式的shell来逐条执行脚本里的命令。脚本执行完毕后,这个非交互式shell就会退出,Putty检测到连接断开,自然就关闭了终端。而-i参数强制bash进入交互式模式,会持续等待用户输入;exec则是让bash替代原来的非交互式shell,让Putty的连接一直绑定到这个活跃的bash进程上。
内容的提问来源于stack exchange,提问作者igor

