#linux #bash
#linux #bash
Вопрос:
Я пытаюсь смоделировать условие для тестового примера, когда сервер Linux не работает в течение 10 минут. Я знаю, как выключить компьютер, но он автоматически перезапустится, если я введу reboot
команду. В настоящее время я использую следующий способ для удержания target
в течение 600 секунд. но это ненадежно, так как иногда это приводит к частичному запуску target перед очередной перезагрузкой. приводит к неверному результату.
target="active001"
secs=600 ;SECONDS=0 ;
while (( SECONDS < secs ));
do
ssh ${target} reboot
sleep 1;
done
Комментарии:
1.
halt
следует отключить его навсегда. Проблема в том, чтобы запустить его снова. На некоторых компьютерах есть функцияwake-on-lan
, поэтому вы можете запустить ее удаленно, но она может работать в локальной сети.2. Является ли ваш сервер виртуальной машиной? Если да, есть ли у вас доступ к гипервизору? Если нет, есть ли у вас доступ к оборудованию? Простой ответ на ваш вопрос — использовать
shutdown
вместоreboot
, но тогда вам нужно что-то, чтобы вернуть компьютер через 10 минут.3. Может быть, просто отключить сеть на сервере Linux на некоторое время?
4. Вы можете включить автоматическую загрузку в BIOS, а затем использовать электронный переключатель (domotic) для включения дистрибутива выключения (если у вас есть аппаратный блок)
5.
ssh $target 'bash -c "sudo if down; sleep 600; sudo if up" amp;'
гдеif
находится команда интерфейса вашего дистрибутива для управления сетевыми устройствами.
Ответ №1:
#!/bin/bash
# ...<3600
STATUS="active001"
TARGET_SECOND="600"
TARGET_TIME=$(($(date %M) $TARGET_SECOND))
TARGET_TIME_UP=$(($(date %s) $TARGET_SECOND))
START_TIME=$(date %s)
printf "33[01;35mStarting Schedhule Reboot if need... 33[01;32mInterval ($(date -d @$TARGET_TIME %M) Minute)33[01;00mn"
while true; do
TIME_NOW=$(date %s)
DELTATIME=$(($TARGET_TIME_UP - $TIME_NOW))
TIMELAPSE=$(date -ud "@$DELTATIME" '%H:%M:%S')
if [ $TIME_NOW = $TARGET_TIME_UP ];then
#printf "nRunning script command...n"
ssh ${STATUS} reboot
#end loop or other option
break
fi
printf "r$(date -d @$TIME_NOW %H:%M:%S) 33[01;32mReboot Execute on: 33[01;32m$(date -d @$TARGET_TIME_UP %H:%M:%S)33[00;00m [ ELAPSED : $TIMELAPSE ] "
sleep 1
done
Комментарии:
1. Как это будет работать лучше, чем существующий код OP?