通过nohup在70台服务器持续运行bash脚本遇阻求助
问题原因分析及修复方案
卡住的核心原因
- SSH默认会将本地标准输入绑定到远程会话,即便远程命令用
&后台运行,SSH仍会等待远程进程的输入操作,导致脚本卡在第一个IP处无法继续执行。 mkdir monitoring-api如果目标目录已存在,会抛出错误,虽然后续命令仍会执行,但可能干扰$?的状态判断。
nohup进程被终止的原因
- 未重定向
nohup的标准输出和错误流,这些流仍会关联到SSH会话,当你用ctrl+c终止SSH连接时,远程进程会收到SIGHUP信号被终止。 - 即便用了
nohup,若进程未完全脱离终端会话,SSH断开时仍可能被系统回收。
修复后的脚本
for ip in $(cat ip_address_list.txt) do echo "Executing for $ip" # 关键修改:-n 参数让SSH不读取本地stdin,避免卡住;重定向nohup输出;mkdir -p避免重复创建报错 ssh -n -i ~/sysadmin.pem -o StrictHostKeyChecking=no sysadmin@$ip " mkdir -p ~/monitoring-api cd ~/monitoring-api /usr/bin/gsutil cp gs://sysadmin/abc.sh . chmod +x abc.sh nohup ./abc.sh > nohup.out 2>&1 & " if [ $? -eq 0 ] then echo "Execution successful for $ip" else echo "Execution failed for $ip" fi done
关键修改说明
-n:SSH的-n参数会将标准输入重定向到/dev/null,避免SSH等待本地输入,解决脚本卡住的问题。mkdir -p:加上-p参数,即使目录已存在也不会报错,避免不必要的错误输出干扰脚本流程。nohup ./abc.sh > nohup.out 2>&1 &:将标准输出和错误输出都重定向到nohup.out,彻底脱离SSH的输出通道,确保进程在SSH断开后能持续运行。
内容的提问来源于stack exchange,提问作者innervoice
相关产品推荐
相关产品推荐

