1

ОК, так немного фона;

Я уже некоторое время использую Windows Home Server в качестве устройства резервного копирования, медиасервера и общего сервера дома. Я решил, что это стоило мне много сока, поэтому очень рано добавил надстройку « Lights Out », чтобы убедиться, что она работает только тогда и только тогда, когда это необходимо.

Сейчас я хочу переключиться на сервер на базе Linux и ищу аналогичный инструмент / набор инструментов для расширенного управления питанием.

Теперь вопрос;

Кто-нибудь получил какие-либо предложения «все в одном» (например, с клиентскими частями для Windows и Linux и серверной частью для сервера Linux), или кто-то может просто проверить, что мне нужно самому настроить все отдельные биты для этого по отдельности?

(Инструмент, похожий на « SmartPower », но для Linux будет отличным началом)

4 ответа4

2

К сожалению, вы не указали свои конкретные требования, поэтому сложно понять, что именно вам нужно.

Однако с помощью сценариев оболочки почти все возможно. У меня есть сценарий оболочки, который отключает компьютер, когда определенные клиенты (разделенный пробелами список в переменной CLIENTS) больше не подключены к сети, и некоторые процессы (разделенный пробелами список в переменной PROCESSES) не выполняются для последних 3 проверок:

 #!/bin/sh

LOGFILE=/var/log/autoshutdown.log
CLIENTS="hanzo twix"
PROCESSES="screen"
CHECK_THRESHOLD=3
CHECK_COUNT_FILE=/tmp/autoshutdown_count

FALSE=1
TRUE=0

function log() {
    typeset message="$1"
    echo "$(date +'%Y-%m-%d %H:%M:%S')  $message" >> $LOGFILE
}

function clientsOnline() {
    typeset flag_online=$FALSE
    for client in $CLIENTS
    do
        if ping -c 1 $client 1>/dev/null 2>/dev/null
        then
            #log "Client $client is online."
            flag_online=$TRUE
        else
            #log "Client $client is offline."
            true                                                                                                         
        fi
    done                                                                                                                 

    return $flag_online                                                                                                  
}                                                                                                                        

function processRunning() {
    typeset process_flag=$FALSE                                                                                          
    for process in $PROCESSES                                                                                            
    do                                                                                                                   
        if ps -e | grep -qs $process                                                                                     
        then                                                                                                             
            #log "Process $process is running."                                                                          
            process_flag=$TRUE
        else                                                                                                             
            #log "Process $process is not running."
            true                                                                                                         
        fi                                                                                                               
    done                                                                                                                 

    return $process_flag
}

function resetShutdownCounter() {
    echo "0" > $CHECK_COUNT_FILE                                                                                         
}                                                                                                                        

function getShutdownCount() {
    if [ -r $CHECK_COUNT_FILE ]
    then
        cat $CHECK_COUNT_FILE | head -n 1
    else
        echo 0
    fi
}

function incrementShutdownCounter() {
    echo $(expr $(getShutdownCount) + 1) > $CHECK_COUNT_FILE
}

if [ $(id -u) -ne 0 ]
then
    echo "This script must be run as root user." >&2
    exit 1
fi

#log "### Starting ###"

if clientsOnline
then
    #log "At least one client is online. Reseting shutdown count."
    resetShutdownCounter
elif processRunning
then
    #log "At least one of the registered processes is running. Reseting shutdown count."
    resetShutdownCounter
else
    incrementShutdownCounter
    log "No registered client online. Shutdown counter incremented. Current value: $(getShutdownCount)"

    if [ $(getShutdownCount) -ge $CHECK_THRESHOLD ]
    then
        log "Shutdown count threshold reached. Shutting down system in 10 seconds."
        rm -f $CHECK_COUNT_FILE
        /sbin/shutdown -h 1
    fi
fi

Все, что вам нужно сделать, это запускать этот скрипт из вашего crontab каждые 5 минут. Затем он выключит ваш компьютер, если условия выключения будут выполнены в течение 15 минут подряд.

1

На самом деле, это довольно просто.

Чтобы выключить компьютер с Linux, вам нужно всего лишь выполнить '/sbin/telinit 6' (от имени root!) из командной строки или скрипта. Это корректно завершает все процессы и отключается через BIOS. Обратите внимание, что это работает не все материнские платы, но в 99% случаев это работает.

Есть много способов автоматизировать это ... Я не знаю ни одного автоматизированного пакета, но не сложно создать его самостоятельно. Я предполагаю, что вы используете сервер и рабочий стол / ноутбук для работы. Если, например, вы хотите, чтобы ваша система Linux автоматически отключалась после выключения рабочего стола Windows, вы можете написать скрипт, который пингует ваш компьютер с Windows каждые 5 минут. Если это не помогло 3 раза подряд, выключите машину. Другой возможностью является веб-страница, доступная только с вашей локальной сети, которая инициирует (отложенное) отключение; Вы просто убедитесь, что эта страница вызывается при завершении работы Windows. Etcetera ...

0

Другой механизм (для добавления к ответам других) - это gnome-power-cmd.sh, если вы используете Gnome:

gnome-power-cmd.sh {suspend | отключение | спящий | перезагружать}

Похоже, использовать DBUS. Я не знаю, насколько это будет полезно, если вы планируете запустить сервер без Gnome.

0

Что касается выключения в определенное время, вы можете сделать это довольно легко, поместив запись в /etc /crontab

30 2 * * * root /sbin /shutdown -h 0

Это отключит систему в 2:30 утра каждый день.

Некоторые BIOS позволяют настроить систему на включение в определенное время, это еще один вариант, кроме пробуждения по локальной сети.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .