bash:优雅的方式来忙等待直到远程设备启动?

时间:2017-09-14 16:42:53

标签: bash macos shell ssh

在我的bash脚本中,我正在运行ssh命令来重启设备:

ssh root@device reboot

在此之后,我想在发送更多ssh命令之前等待设备启动,否则它们将会丢失。

1 个答案:

答案 0 :(得分:2)

如果设备运行Linux,您可以从procfs:

轮询启动ID
#!/usr/bin/env bash
max_timeout=600

if ! { device_boot_id=$(ssh root@device "cat /proc/sys/kernel/random/boot_id") \
       && [[ $device_boot_id ]]; }; then
  echo "Unable to retrieve initial boot ID -- is the device up to start with?" >&2
  exit 1
fi
if ! ssh root@device "reboot"; then
  echo "Attempt to ask device to reboot failed" >&2
  exit 1
fi

timeout_at=$(( SECONDS + max_timeout ))
until new_boot_id=$(ssh root@device "cat /proc/sys/kernel/random/boot_id") \
      && [[ $new_boot_id != "$device_boot_id" ]]; do
  if (( SECONDS > timeout_at )); then
    echo "System is still not back; giving up" >&2
    exit 1
  fi
  sleep 10
done

echo "System successfully rebooted" >&2

在其他系统上,您可以轮询正常运行时间 - 如果它发生故障,那么您就知道系统已重新启动。 (但是,如果系统已经足够长,以至于您能够在达到之前的启动正常运行时间之前连接并重新轮询,那么这只是可靠的。)