Как сохранить завершение работы Linux-машины на фиксированную продолжительность

#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?