如何在某些情况下自动关闭(最好是打开)我的 Linux 计算机?

如何在某些情况下自动关闭(最好是打开)我的 Linux 计算机?

好的,介绍一下背景;

一段时间以来,我一直在家中使用 Windows Home Server 作为备份设备、媒体服务器和共享服务器。我认为它耗电太多,所以很早就添加了“熄灯“附加组件以确保它只在需要时运行。

我现在想切换到基于 Linux 的服务器,并正在寻找用于高级电源管理的类似工具/工具集。

现在的问题是;

有人有任何一体化建议(即适用于 Windows 和 Linux 的客户端部分以及适用于 Linux 服务器的服务器部分),或者有人可以简单地验证我是否需要自己分别设置所有单独的位?

(类似于“智能电源“但对于 Linux 来说这是一个很好的开始)

答案1

不幸的是,您没有指定您的具体要求,因此很难知道您到底需要什么。

但是使用 shell 脚本几乎一切皆有可能。我有一个 shell 脚本,一旦特定客户端(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

您所要做的就是每 5 分钟从 crontab 运行一次此脚本。然后,如果连续 15 分钟满足关机条件,它就会关闭您的计算机。

答案2

事实上,这很简单。

要关闭 Linux 机器,您只需从命令行或脚本执行“/sbin/telinit 6”(以 root 身份!)即可。这将有序地关闭所有进程并通过 BIOS 关闭电源。请注意,这并非适用于所有主板,但在 99% 的情况下确实如此。

有很多方法可以实现自动化...我不知道有任何自动化软件包,但自己创建一个并不难。我假设您正在使用服务器和台式机/笔记本电脑进行工作。例如,如果您希望在关闭 Windows 桌面后自动关闭 Linux 系统,则可以编写一个脚本,每 5 分钟 ping 一次 Windows 机器。如果连续 3 次失败,则关闭机器。另一种可能性是网页,只能从您的本地局域网访问,以启动(延迟)关机;您只需确保在 Windows 关闭时调用该页面即可。等等...

答案3

至于在特定时间关机,你可以通过在 /etc/crontab 中添加条目来轻松完成

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

这样系统将在每天凌晨 2:30 关闭。

一些 BIOS 允许您设置系统在特定时间开机,这是除局域网唤醒之外的另一种选择。

答案4

如果您使用 Gnome,另一种机制(添加到其他人的回应)是 gnome-power-cmd.sh:

gnome-power-cmd.sh {暂停 | 关机 | 休眠 | 重启}

它似乎使用 DBUS。不过,如果你打算运行没有 Gnome 的服务器,我不知道这会有多大用处。

相关内容