2010年5月25日

Linux Shell Script: 市電中斷後限時自動關機

目的: 在支援 ACPI 電源管理的筆記型電腦中監看變壓器供電狀態, 供電中斷後若未能於限制時間內復電則自動關機.

這對 Laptop Server 很有幫助, 前題是電池仍能續電. 03 年買的 Compaq Presario X1034 是我用過最耐用的筆電, 到目前為止所有功能都正常, 且電池仍有 3254mAh 的蓄電量, 拿來當 Server 真有點不捨哩!

使用 acpid

vi /etc/acpi/events/ac_adapter.conf

event=ac_adapter.*
action=/etc/acpi/actions/ac_adapter.sh

vi /etc/acpi/actions/ac_adapter.sh

#!/bin/bash
 
countdown=180 #等候復 電的迴圈執行次數, 與 sleep 1 配合則變成等候秒數
state=/proc/acpi/ac_adapter/AC0/state #ac_adapter/state 路徑
if [ -n "$(grep off $state)" ]; then
    #如果變壓器未供電就進行以下處置
    while [ $((countdown--)) -gt 0 ]; do
        #如果 $countdown 大於 0 就進行迴圈處理
        #while 判斷後 $countdown 減 1
        if [ -n "$(grep on $state)" ]; then
            #若已復電則離開 shell script
            exit
        else
            #暫停一秒鐘
            sleep 1
        fi
    done
    #如果倒數完了都還沒恢復供電, 就自動關機
    #關機前用 logger 指令做系統 log 記錄
    logger "Automatic shutdown due to power failure timeout."
    sync
    shutdown -h now
fi

chmod +x /etc/acpi/actions/ac_adapter.sh

/etc/init.d/acpid restart

-

不使用 acpid

vi /usr/local/bin/check_process.sh

#!/bin/sh
 
#監看 ac_monitor.sh 是否正在執行中, 若否則執行之
if [ -z "$(pgrep ac_monitor.sh)" ]; then
    exec /usr/local/bin/ac_monitor.sh
fi

chmod +x /usr/local/bin/check_process.sh

vi /usr/local/bin/ac_monitor.sh

#!/bin/bash
 
timeout=180 #等候復電的 秒數
countdown=$timeout
state=/proc/acpi/ac_adapter/AC0/state
while [ true ]; do
    #以無窮迴路監看變壓器供電狀態
    if [ -n "$(grep off $state)" ]; then
        #如果變壓器未供電就進行以下處置
        if [ $((countdown--)) -eq 0 ]; then
            #如果倒數完了都還沒 恢復供電, 就自動關機
            #關機前用 logger 指令做系統 log 記錄
            logger "Automatic shutdown due to power failure timeout."
            sync
            shutdown -h now
            exit
        fi
    else
        #若變壓器供電中, $countdown 維持 $timeout 設定
        countdown=$timeout
    fi
    #等候一秒再繼續監看變壓器供電狀態
    sleep 1
done

chmod +x /usr/local/bin/ac_monitor.sh

vi /etc/crontab

* * * * * root /usr/local/bin/check_process.sh


http://cha.homeip.net/blog/2010/05/2327.html

沒有留言:

發佈留言