我想创build一个shell脚本重新启动一台linux机器,当脚本刚刚结束时,机器启动并再次运行(启动和运行,我的意思是接受SSH连接)。
该脚本应该像(伪代码)一样执行:
reboot machine #sth like 'ssh root@MACHINE reboot' respecting a timeout of 120 secods do: try to connect to machine by ssh sleep one second if it could not connect return an error if timed out return ok if machine is ready for ssh connections
问题是,我真的想避免长时间的睡眠命令,以便我的重新启动脚本尽快给出结果(当然,如果不是超时的话)。
任何人都做了这样的事情?
更新:从adamo的想法开始,我做了:
timeout=120 start=$(date +%s) ssh root@$FAST_HOST reboot do nc -z $1 22 if [ $? eq 0]; then echo host is ready exit 0 fi end=$(date +%s) diff=$(( $end - $start )) if [ $diff -gt timeout ] echo timeout exit 1 fi sleep 1 done
我的问题是,无法连接时,nc命令需要很长时间才能返回。 任何方式只是为了检查端口是否打开一个很短的超时?
在重新引导期间,我使用类似于以下内容的方式连接到计算机。 它期望你有公钥authentication(或其他无密码authentication)的设置。
#!/bin/sh if [ -z "$1" ] ; then echo "You must pass a host to reboot." fi HOST="$1" USER="USER TO SSH AS" # if the user has the right to reboot a machine without sudo, # the following can be empty. SUDO="/usr/bin/sudo" SSH="/usr/bin/ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=1 $USER@$HOST" echo -n "Rebooting $HOST..." if ! $SSH $SUDO reboot ; then echo 'FAILED!' exit 1 fi echo "ok." echo -n "Sleeping 30 seconds..." sleep 30 echo "done." echo -n "Waiting for $HOST..." while ! $SSH echo -n > /dev/null 2>/dev/null ; do echo -n '.' done echo "ok." echo "Machine rebooted successfully."
尝试这样的事情:
#!/bin/bash sleep 120 while true do nc -z $1 22 if [ $? eq 0 ]; then echo host is ready exit 0 fi sleep 1 done
你需要完善它(例如检查是否给脚本和东西提供了一个参数)
尝试使用nmap -p 22 。 如果需要的话,它可以和--*-rtt-timeout选项组合在一起。
另一方面,如何尝试一种完全不同的方法,如SNMP? 它似乎更接近你所需要的,它已经解决了你在试图重新发明轮子时遇到的许多问题。
您可以在循环中使用ping,其超时时间与您在问题中提到的时间类似。
您可以一次执行一次ping操作,然后检查其退出状态。 获得成功的ping(退出状态0)后,您可以检查SSH。
编辑:
作为另一种select,您可以使远程计算机在启用SSH的情况下通知您。 例如,你可以添加一个这样的命令在系统启动时执行。 它可以添加到SSH守护进程启动文件中。
scp /root/dummy_file root@your_machine:~
当然,这应该在两台机器(从远程机器到监控机器)之间build立信任之后完成,以避免询问密码。
在监控机器上,如果文件存在于脚本的开头,则可以删除该文件。 重新启动后,您可以检查文件。 如果文件存在,则机器重新启动并运行。