在shell中远程ssh服务器,执行服务器上的脚本

在shell中远程ssh服务器,执行服务器上的脚本

背景:在shell脚本A里执行pssh,执行该脚本A,该脚本A的进程会一直卡死

原因:pssh是一个批量linux终端执行命令的工具,它执行完毕后会需要占用终端的输入输出打印执行结果,而脚本A本身就是一个进程,它执行pssh也需要占用终端的输入输出打印pssh的执行结果,那么就产生了死锁问题,导致脚本A的进程一直卡死

解决方法1:nohup的使用

使用nohup将pssh挂到后台执行,即形成一个子进程,使得脚本A和pssh不会同时抢占输入输出。(allip是内容为需要远程访问的服务器ip的文件)

#脚本作用:去到每台服务器上打印“你的大爸爸”
#!/bin/bash
echo "我来了哦"
nohup  pssh -h allip -i "echo '你的大爸爸'" > pssh.txt
cat pssh.txt

#执行结果将重定向到pssh.txt文件中,但为了能够即时显示出来,所以添加了cat pssh.txt
#"echo '你的大爸爸'"也可以替换为其他命令,只是执行后的返回信息还是会打印到pssh.txt中
#执行结果:
[root@24-78 ~]# ./pssh_shell.sh 
我来了哦
nohup: ignoring input and redirecting stderr to stdout
[1] 14:22:24 [SUCCESS] 10.10.24.81
你的大爸爸
[2] 14:22:24 [SUCCESS] 10.10.24.80
你的大爸爸
[3] 14:22:24 [SUCCESS] 10.10.24.84
你的大爸爸
[4] 14:22:24 [SUCCESS] 10.10.24.82
你的大爸爸
[5] 14:22:24 [SUCCESS] 10.10.24.83
你的大爸爸
[6] 14:22:25 [SUCCESS] 10.10.24.78
你的大爸爸
[7] 14:22:25 [SUCCESS] 10.10.24.79
你的大爸爸
[root@24-78 ~]# 

解决方法2:输出重定向

远程执行的内容在“<< EOF ” 至“EOF”之间,在远程机器上的操作就位于其中,注意的点:

  1. << EOF,ssh后直到遇到EOF这样的内容结束,EOF可以随便修改成其他字符。
  2. 重定向目的在于不显示远程的输出了,这样也同样不抢占输入输出
  3. 在结束前,加exit退出远程节点
#脚本作用:去到每台服务器,执行服务器上家目录下的test.sh脚本
#!/bin/bash
IPW=$1
for i in $(cat $IPW)
do
  echo "${i}开始冲啊";
  ssh root@${i} > /dev/null 2>&1 << EOF
  ./test.sh
  exit
EOF
echo done! 
done
#执行结果
[root@24-78 ~]# ./open_test.sh allip 
10.10.24.78开始冲啊
done!
10.10.24.79开始冲啊
done!
10.10.24.80开始冲啊
done!
10.10.24.81开始冲啊
done!
10.10.24.82开始冲啊
done!
10.10.24.83开始冲啊
done!
10.10.24.84开始冲啊
done!
[root@24-78 ~]# 
#检验是否执行
#去到24.79的服务器上查看,24.79服务器上的test.sh脚本的作用是生成以当前时间命名的文件夹;
#结果如下
[root@24-79 ~]# ls
2021-09-16_1309  2021-09-16_1409  anaconda-ks.cfg  change_hostname.sh  test.sh

参考资料:
https://blog.csdn.net/w_y_x_y/article/details/109774463
https://blog.csdn.net/xiaoxiaonvwu/article/details/70742115

你可能感兴趣的:(linux,linux,ssh,shell)