我有一个在Ubuntu 12.04上运行的应用程序服务器,我正在启动并通过以下命令停止 -
停止应用服务器
david@machineA:/opt/kml$ /opt/kml/bin/kml_start_stop.sh stop
启动应用服务器
david@machineA:/opt/kml$ /opt/kml/bin/kml_start_stop.sh start
现在我正在尝试编写一个shell脚本,它将使用上面的命令停止并启动我的应用程序服务器,但是这个shell脚本我将从machineX
运行。从machineX
我们可以无需密码即可登录用户david
到machineA
例如 - 来自machineX
我无需输入密码即可ssh david@machineA
。
以下是我的开始。一切看起来都合适吗?
#!/bin/bash
ssh david@machineA
/opt/kml/bin/kml_start_stop.sh stop
sleep 10s
/opt/kml/bin/kml_start_stop.sh start
答案 0 :(得分:1)
您可以使用here document远程执行某些脚本:
ssh david@machineA << EOJ
/opt/kml/bin/kml_start_stop.sh stop
sleep 10
/opt/kml/bin/kml_start_stop.sh start
EOJ
在您的情况下,您还可以在本地执行多个ssh
命令和sleep
:
ssh david@machineA /opt/kml/bin/kml_start_stop.sh stop
sleep 10
ssh david@machineA /opt/kml/bin/kml_start_stop.sh start
顺便说一句,我建议您学习更多关于shell脚本的知识。你可以阅读Advanced Bash Scripting Guide(有批判性的眼睛,确实有不完善之处)和documentation of GNU bash
。特别是,要在多台计算机上执行此操作,您可以使用一些bash for
循环。
答案 1 :(得分:1)
不,你不能这样做,因为ssh
将登录并等待命令,而你想要将命令提供给完全相同的ssh。该脚本看起来应该更像这样:
#!/bin/bash
while read host rest; do
ssh david@$host <<EOF &
/opt/kml/bin/kml_start_stop.sh stop
sleep 10s
/opt/kml/bin/kml_start_stop.sh start
EOF
done < hostlist.txt
wait
使用名为“here document”的Bash功能,该功能将文本提供给ssh
进程的标准输入。
编辑:我添加了一个小技巧:我在每个ssh作业启动时对其进行后台处理,因为每个作业都需要一些时间才能完成(由于睡眠而至少需要10秒)。然后在最后我做wait
等待所有这些完成。这样,整个脚本可以在10秒内运行,加上开销时间,无论有多少台服务器。
答案 2 :(得分:1)
此脚本将执行远程终端上的命令。
#!/bin/bash
ssh david@machineA '/opt/kml/bin/kml_start_stop.sh stop && sleep 10s && /opt/kml/bin/kml_start_stop.sh start'
如果您之前使用了以下脚本,则会生成一个单独的ssh会话shell以连接到远程计算机,并且以下命令将在本地计算机shell上运行,而不是在远程计算机上运行
#!/bin/bash
ssh david@machineA
/opt/kml/bin/kml_start_stop.sh stop
sleep 10s
/opt/kml/bin/kml_start_stop.sh start