acpid

ACPI是Advanced Configuration and PowerInterface縮寫,acpid中的d則代表daemon。Acpid是一個用戶空間的服務進程,它充當linux內核與應用程序之間通信的接口,負責將kernel中的電源管理事件轉發給應用程序。
acpid與內核的通信方式:acpid用poll函數掛在/proc/acpi/event文件上。內核在drivers/acpi/event.c
中實現了該文件的接口,一旦總線事件列表(acpi_bus_event_list)上有電源管理事件發生,內核就會喚醒掛在
/proc/acpi/event上的acpid,acpid再從/proc/acpi/event中讀取相應的事件。
acpid與應用程序的通信方式有兩種:
其一是通過本地socket,其文件名爲/var/run/acpid.socket,應用程序只要連接到這個socket上,不用發送任何命令就可以接收到acpid轉發的電源管理事件。
其二是通過配置文件。在acpid收到來自內核的電源管理事件時,根據配置文件中的規則執行指定的命令。配置文件在/etc/acpi/events/目錄下,下面是一個示例:
event=button/power.*
action=/sbin/shutdown -h now
事件的格式爲:device_class bus_id type data。device_class和bus_id是字符串,type和data是十六制整數。在配置文件中可以使用通配符,來匹配指定的事件。

acpid是用於處理電源相關事件的守護進程,它非常靈活且易於擴展。它偵聽/proc/acpi/event,當某個事件發生時,執行相關程序來處理該事件。這些事件是由某些動作觸發的,比如:

  • 按下電源按鈕
  • 按下睡眠/掛起按鈕
  • 合上筆記本蓋子
  • 拔下/插上筆記本外接電源

請注意桌面環境比如GNOME傾向於使用自己的電源事件管理方法(獨立於acpid),systemd的登陸管理器也有它自己的一套管理方法。同時運行多套系統可能產生意想不到的結果,比如,當按下電源鍵時電腦同時執行掛起和關機;或者當按下睡眠按鈕時電腦執行了兩次掛起操作。所以,使用多套系統時你應只激活一套系統的電源事件管理方法,以免引起衝突。

acpid預置了許多事件觸發行爲,比如它定義了當你按下電源按鈕時應當發生什麼。這些觸發行爲默認在/etc/acpi/handler.sh中定義。在/etc/acpi/events/anything)規定:任何偵測到的電源事件都會按照/etc/acpi/handler.sh中定義的觸發行爲執行相關動作。

下面是一個定義觸發行爲的簡單例子。在這個例子中,當按下睡眠按鈕時acpid運行命令echo -n mem >/sys/power/state,這將會使你的電腦掛起:

button/sleep)
    case "$2" in
        SLPB) echo -n mem >/sys/power/state ;;
	 *)    logger "ACPI action undefined: $2" ;;
    esac  # esac 表示 case 語句塊的結束
    ;;

不幸的是計算機上的這些電源事件標識並不統一,比如,在一些計算機上睡眠按鈕可能被標識爲SLPB,而在另一些計算機上爲SBTN

要想確定各種按鈕或Fn快捷鍵在你的計算機上是如何定義的,以root身份在終端運行:

# tail -f /var/log/messages.log
-f如果輸入文件是常規文件或如果 File 參數指定 FIFO(先進先出),那麼 tail 命令不會在複製了輸入文件的最後的指定單元后終止,而是繼續從輸入文件讀取和複製額外
的單元(當這些單元可用時)。如果沒有指定 File 參數,並且標準輸入是管道,則會忽略 -f 標誌。tail -f 命令可用於監視另一個進程正在寫入的文件的增長。 

現在在你計算機上按下電源按鈕或睡眠按鈕(比如Fn+Esc),你會得到類似以下的結果:

logger: ACPI action undefined: PBTN
logger: ACPI action undefined: SBTN

如果這不起作用的話,運行:

# acpi_listen

然後按下電源按鈕,你會看到類似以下輸出:

power/button PBTN 00000000 00000b31

acpi_listen的輸出會被作爲$1, $2 , $3 & $4參數發送給/etc/acpi/handler.sh。舉例:

$1 power/button
$2 PBTN
$3 00000000
$4 00000b31

像你看到的那樣,在這個例子中睡眠按鈕被識別爲SBTN,而不是SLPB(這是/etc/acpi/handler.sh中默認定義的標識符)。所以,要想讓你的睡眠按鈕正常工作的話,你需要編輯/etc/acpi/handler.shSLPB)替換爲SBTN)

參照上面的例子,你應該可以很容易的通過定製/etc/acpi/handler.sh來根據偵測到的電源時間來執行不同的命令。更多例子可參考下面的 小技巧部分。

其它配置方案

默認所有的電源事件都是交由/etc/acpi/handler.sh處理的。這是由/etc/acpi/events/anything規定的:

# Pass all events to our one handler script
event=.*
action=/etc/acpi/handler.sh %e

儘管這樣配置工作起來沒有任何問題,但一些用戶可能更喜歡使用各自獨立的腳本來定義不同的電源事件。下面舉例說明了如何使用不同的事件定義文件和行爲定義文件:

作爲root,創建以下文件:

/etc/acpi/events/sleep-button
event=button sleep.*
action=/etc/acpi/actions/sleep-button.sh "%e"

然後建立以下文件:

/etc/acpi/actions/sleep-button.sh
#!/bin/sh
case "$2" in
    SLPB) echo -n mem >/sys/power/state ;;
    *)    logger "ACPI action undefined: $2" ;;
esac

最後,給腳本加上可執行權限:

# chmod +x /etc/acpi/actions/sleep-button.sh

用這種方法,你可以任意的獨立的事件/行爲腳本。

小技巧

Tip: Some of actions, described here, such as Wi-Fi toggle and backlight control, may already be managed directly by driver. You should consult documentation of corresponding kernel modules, when this is the case.

腳本示例

下面給出的例子可以用在你的/etc/acpi/handler.sh腳本中,只是在使用的時候記得將事件變量更改爲acpi_listen偵測到的那個。

實現合上筆記本蓋子時使用xscreensaver鎖屏:

button/lid)
    case $3 in
        close)
            # The lock command need to be run as the user who owns the xscreensaver process and not as root.
            # See: man xscreensaver-command. $xs will have the value of the user owning the process, if any.

            xs=$(ps -C xscreensaver -o user=)
            if test $xs; then su $xs -c "xscreensaver-command -lock"; fi
            ;;

實現合上筆記本蓋子時掛起系統並用slimlock鎖屏:

button/lid)
    case $3 in
        close)
            #echo "LID switched!">/dev/tty5
	     /usr/sbin/pm-suspend &
	     DISPLAY=:0.0 su -c - username /usr/bin/slimlock
            ;;

實現插拔外接電源時自動設置屏幕亮度(數值可能需要調整,參考/sys/class/backlight/acpi_video0/max_brightness):

ac_adapter)
    case "$2" in
        AC*|AD*)
            case "$4" in
                00000000)
                    echo -n 50 > /sys/class/backlight/acpi_video0/brightness
                    ;;
                00000001)
                    echo -n 100 > /sys/class/backlight/acpi_video0/brightness
                    ;;
            esac

音量調整

下面的一系列腳本是用來控制音量的(假設你用的是ALSA)。用上面講到的方法找到音量鍵的標識符,然後替換掉下面文件中的事件標識就可以用在自己電腦上了:

/etc/acpi/actions/volume_up.sh
  #!/bin/bash
  /usr/bin/amixer set Master 5%+
/etc/acpi/actions/volume_down.sh
  #!/bin/bash
  /usr/bin/amixer set Master 5%-

定義事件的文件:

/etc/acpi/events/volume_up
  event=button[ /]volumeup
  action=/etc/acpi/actions/volume_up.sh
/etc/acpi/events/volume_down
  event=button[ /]volumedown
  action=/etc/acpi/actions/volume_down.sh

用於切換靜音的配置文件:

/etc/acpi/events/volume_mute
  event=button[ /]volumemute
  action=/usr/bin/amixer set Master toggle

關閉筆記本顯示器

下面這個小技巧修改自Gentoo Wiki。把下面的內容添加到/etc/acpi/actions/lm_lid.sh最後,或者添加到/etc/acpi/handler.shbutton/lid部分。這個配置會實現當合上筆記本蓋子時自動切斷LCD背光,揭開蓋子時自動打開LCD背光。

case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
    closed) XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force off ;;
    open)   XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force on  ;;
esac

如果你想提高、降低亮度或做其他一些跟X有關的事情,你應當明確指定你的X顯示接口以及那個神奇的MIT cookie文件(一個用於對X服務器和其它輸入設備進行讀寫訪問的安全憑證)。

下面的腳本沒有用到XAUTHORITY,使用了sudo:

case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
    closed) sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force off ;;
    open)   sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force on  ;;
esac

在一些難纏的硬件上當使用某些版本的Xorg時,xset dpms force off只會使屏幕變黑並不會關閉屏幕背光。這個bug可以用 vbetool(來自official repositories)來修復。做以下更改:

case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
    closed) vbetool dpms off ;;
    open)   vbetool dpms on  ;;
esac

如果顯示器只是快速的關閉然後又打開,很可能是xscreensaver自帶的電源管理跟dpms的設置衝突了。

獲取當前登陸的用戶名

你可以使用getuser函數來獲取當前登陸的用戶名:

getuser ()
    {
     export DISPLAY=`echo $DISPLAY | cut -c -2`
     user=`who | grep " $DISPLAY" | awk '{print $1}' | tail -n1`
     export XAUTHORITY=/home/$user/.Xauthority
     eval $1=$user
    }

然後這個函數就可以被用在下面的例子中,它可以在你按下電源按鈕時正常的關閉KDE

button/power)
    case "$2" in
        PBTN)
            getuser "$user"
            echo $user > /dev/tty5
            su $user -c "dcop ksmserver ksmserver logout 0 2 0"
            ;;
          *) logger "ACPI action undefined $2" ;;
    esac
    ;;

ACPI 快捷鍵

您可以直接編輯/etc/acpi/handler.sh, 將快捷鍵反應到ACPI事件, 或者您也可以將這些快捷鍵指向別的自己定義的一些腳本 (例如: /etc/acpi/hotkeys.sh)

在這行之下

case "$1" in

添加如下行的內容:

hkey)
	case "$4" in
		00000b31)
		echo "PreviousButton pressed!"
		exailectl p
		;;
	00000b32)
		echo "NextButton pressed!"
		exailectl n
		;;
	00000b33)
		echo "Play/PauseButton pressed!"
		exailectl pp
		echo "executed.."
		;;
	00000b30)
		echo "StopButton pressed!"
		exailectl s
		;;
	*)
		echo "Hotkey Else: $4"
		;;
	esac
	;;

這個 '00000b31' 之類的值就是通過acpi_listen監聽到的快捷鍵的值.在acpi_listen監聽到的值中'hkey VALZ 00000000 00000b31', $4也就是最後部分, 就是區別於其他鍵的部分.

並且,我爲了控制Exaile音樂播放器寫了一個簡單的 exailectl 腳本. 因爲ACPID是在root級別的守護進程, 所以您需要用下面方式來寫控制腳本

sudo -u (用戶名) exaile

不然的話,快捷鍵的動作不會檢測到您的用戶正在運行的程序,它就會去重新啓動另一個程序而不是對當前的程序作出反應.


linux 日誌logger 2010-04-09 15:10:45

一 通過logger命令記錄日誌

logger 是一個shell 命令接口,可以通過該接口使用Syslog的系統日誌模塊,還可以從命令行直接向系統日誌文件寫入一行信息。

日誌的級別

日誌的級別分爲七級,從緊急程度由高到底:

emerg 系統已經不可用,級別爲緊急
alert 警報,需要立即處理和解決
crit 既將發生,得需要預防。事件就要發生
warnig 警告
err 錯誤信息,普通的錯誤信息
notice 提醒信息,很重要的信息
info 通知信息,屬於一般信息
debug 這是調試類信息

1。解決方法

編輯syslog.conf,

#vi /etc/syslog.conf

在第一行加入local3.none,使得設備local3的日誌不記錄在messages文件裏,

# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages

將設備local3的所有級別的信息都記錄在userlog文件裏,

#user log

local3.* /var/log/userlog

重新加載syslog服務的配置文件,

[root@KEVEIN Slides]# service syslog reload

Reloading syslogd... [ OK ]

Reloading klogd... [ OK ]

2。測試:

測試機器的環境:

OS:Red Hat Enterprise Linux 5 update 3

Network: 192.168.0.100/24  Gateway:192.168.0.1

[root@KEVEIN Slides]# ping 192.168.0.1 | logger -it logger_test -p local3.notice&

[2] 22484

命令logger -it logger_test -p local3.notice中的參數含義:

-i 在每行都記錄進程ID

-t logger_test 每行記錄都加上“logger_test”這個標籤

-p local3.notice 設置記錄的設備和級別

[root@KEVEIN Slides]# tail -f /var/log/userlog

Oct 6 12:48:43 kevein logger_test[22484]: PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.

Oct 6 12:48:43 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=1 ttl=253 time=49.7 ms

Oct 6 12:48:44 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=2 ttl=253 time=68.4 ms

Oct 6 12:48:45 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=3 ttl=253 time=315 ms

Oct 6 12:48:46 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=4 ttl=253 time=279 ms

Oct 6 12:48:47 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=5 ttl=253 time=347 ms

Oct 6 12:48:49 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=6 ttl=253 time=701 ms

Oct 6 12:48:50 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=7 ttl=253 time=591 ms

Oct 6 12:48:51 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=8 ttl=253 time=592 ms

Oct 6 12:48:52 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=9 ttl=253 time=611 ms

Oct 6 12:48:53 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=10 ttl=253 time=931 ms

ping命令的輸出成功輸出到/var/log/userlog文件中,實驗成功。

二 日誌回捲

系統時時刻刻都在產生日誌,如果不及時清理,很快就會灌滿硬盤,但如果要手工清理,又很麻煩。這種情況下,logrotate 這個程序很好的完成這個任務。

logrotate 用來把舊的日誌文件刪除,並創建新的日誌文件,我們把它叫做“轉儲”。我們可以根據日誌文件的大小,也可以根據其天數來轉儲,這個過程一般通過一個叫做crond的守護進程來執行,logrotate 還可以用於壓縮日誌文件,以及發送日誌到指定的E-mail 。

logrotate 的配置文件是 /etc/logrotate.conf。主要參數如下表:
參數 功能
compress 通過gzip 壓縮轉儲以後的日誌
nocompress  不需要壓縮時,用這個參數
copytruncate  用於還在打開中的日誌文件,把當前日誌備份並截斷
nocopytruncate  備份日誌文件但是不截斷
create mode owner group  轉儲文件,使用指定的文件模式創建新的日誌文件
nocreate  不建立新的日誌文件
delaycompress

             和 compress 一起使用時,轉儲的日誌文件到下一次轉儲時才壓縮
nodelaycompress  覆蓋 delaycompress 選項,轉儲同時壓縮。
errors address  專儲時的錯誤信息發送到指定的Email 地址
ifempty  即使是空文件也轉儲,這個是 logrotate 的缺省選項。
notifempty  如果是空文件的話,不轉儲
mail address  把轉儲的日誌文件發送到指定的E-mail 地址
nomail  轉儲時不發送日誌文件
olddir directory

轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件在同一個文件系統
noolddir  轉儲後的日誌文件和當前日誌文件放在同一個目錄下
prerotate/endscript

在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行
postrotate/endscript

在轉儲以後需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行
daily  指定轉儲週期爲每天
weekly  指定轉儲週期爲每週
monthly  指定轉儲週期爲每月
rotate count

指定日誌文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
tabootext [+] list

          讓logrotate 不轉儲指定擴展名的文件,缺省的擴展名是:.rpm-             orig, .rpmsave, v, 和 ~
size size

當日志文件到達指定的大小時才轉儲,Size 可以指定bytes (缺省)以及KB (sizek)或者MB (sizem).

系統對 logrotate 的執行和操作

在/etc/cron.daily/路徑下,有一個logrotate 的shell腳本,所以cron程序會每天調用一次logrotate程序,然後logrotate程序回去檢查日誌文件是否符合回滾條件,並執行相應動作。

執行操作:/usr/sbin/logrotate /etc/cron.daily/logrotate.conf;

在/etc/logrotate.conf文件中,有如下選項:

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

這個選項說明在執行logrotate程序時,同時執行/etc/logrotated目錄下的所有腳本。

執行動作示例:每月清除/var/log/wtmp目錄中的相關內容:

/var/log/wtmp {

monthly

create 0664 root utmp

rotate 1

}

實驗:

1.

環境: Red Hat Enterprise Linux 5.3

實驗描述:

(1)用Cron執行logrotate命令,每分鐘檢查一次目標日誌文件是否滿足回捲限制。(2)配置/etc/logrotate.conf 或者建立一個自定義的/etc/logrotate.d /userlog

(3)編輯/etc/syslog.conf 使得記錄的日誌信息可以寫入到/var/log/userlog中。

[root@KEVEIN ~]# crontab -e

* * * * * /usr/sbin/logrotate /etc/logrotate.conf //寫入這條命令

[root@KEVEIN ~]# vi /etc/logrotate.conf

***省略***

/var/log/userlog {

daily

size 10k ////在這裏單位大小寫敏感應,應爲 k or M

create 0664 root root

rotate 3

prerotate

/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true

/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true

endscript

}

在這裏一定要加prerotate這段腳本,這樣可以使syslog程序重新讀取配置文件,這樣做的作用是讓syslog程序釋放對userlog文件持有的文件描述符,否則即使日誌文件

回滾,syslog也不會向新產生的日誌文件寫數據。舉個例子,如果不加這段腳本,即使logrotate程序將userlog文件截斷並重命名爲userlog.1,但是syslog程序仍然會向原userlog文件即userlog.1中寫入數據。

[root@localhost ~]# vi /etc/syslog.conf

*****省略*****

*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages

#user log

local3.* /var/log/userlog

重新加載配置文件

[root@KEVEIN ~]# service syslog reload

Reloading syslogd... [ OK ]

Reloading klogd... [ OK ]

重啓crond服務

[root@KEVEIN ~]# service crond restart

Stopping crond: [ OK ]

Starting crond: [ OK ]

測試:

通過logger命令向userlog中寫入數據,測試logrotate的功能

[root@KEVEIN ~]# ping 192.168.1.1 | logger -it logger_test -p local3.notice&

[1] 5144

[root@KEVEIN ~]# cd /var/log/

[root@KEVEIN log]# ll -h userlog*

-rw-r--r-- 1 root root 1.6K Oct 11 19:59 userlog

[root@KEVEIN log]# ll -h userlog*

-rw-r--r-- 1 root root 6.1K Oct 11 20:00 userlog

//雖然執行過logrotate,但是沒有達到限制值

[root@KEVEIN log]# ll -h userlog*

-rw-rw-r-- 1 root root 0 Oct 11 20:08 userlog

-rw-rw-r-- 1 root root 15K Oct 11 20:08 userlog.1

-rw-r--r-- 1 root root 18K Oct 11 20:05 userlog.2

需要注意的是,當達到限制條件時,logrotate程序會將目標日誌文件userlog截斷,並命名爲userlog.1,將原userlog.1改名爲userlog.2,以此類推,syslog程序始終向userlog文件中寫數據。


ACPIAdvanced Configuration and Power Interface縮寫,acpid中的d則代表daemonAcpid是一個用戶空間的服務進程,它充當linux內核與應用程序之間通信的接口,負責將kernel中的電源管理事件轉發給應用程序。

 

acpid與內核的通信方式:acpidpoll函數掛在/proc/acpi/event文件上。內核在drivers/acpi/event.c中實現了該文件的接口,一旦總線事件列表(acpi_bus_event_list)上有電源管理事件發生,內核就會喚醒掛在 /proc/acpi/event上的acpidacpid再從/proc/acpi/event中讀取相應的事件。

 

acpid與應用程序的通信方式有兩種,其一是通過本地socket,其文件名爲/var/run/acpid.socket,應用程序只要連接到這個socket上,不用發送任何命令就可以接收到acpid轉發的電源管理事件。

 

其二是通過配置文件。在acpid收到來自內核的電源管理事件時,根據配置文件中的規則執行指定的命令。配置文件在/etc/acpi/events/目錄下,下面是一個示例:

event=button/power.*

action=/sbin/shutdown -h now

 

事件的格式爲:device_class bus_id type datadevice_classbus_id是字符串,typedata是十六制整數。在配置文件中可以使用通配符,來匹配指定的事件。


acpi與應用程序的通信方式有兩種:

    其一是通過本地socket,其文件名爲/var/run/acpi.socket,應用程序只要連接到這個socket,不用發送任何命令就可以接收到acpid轉發的電源管理事件。

    其二是通過配置文件。在acpid收到來自內核的電源管理事件時,根據配置文件中的規則執行制定的命令。配置文件在/etc/acpi/events/目錄下。例如:

    event = button/power.*

    action = /sbin/shutdown -h now

    事件的格式爲:device_class bus_id type data。device_class和bus_id是字符串,type和data是十六進制整數。在配置文件中可以使用通配符,來匹配製定的事件。






Acpid(8)


名字:

acpid - 高級配置與電源接口事件無交互後臺程序。


概要:

acpid [控制]


描述:

acpid是有計劃的通知用戶空閒程序的ACPI事件,默認情況下acpid是在系統啓動時作爲一個後臺進程啓動。它將打開一個事件文件(默認爲:/proc/acpi/event)並讀取所有的行。當讀取的行內容是被承認的事件時,acpid將檢查一系列規則,並且檢查匹配的事件。


規則是簡單的配置文件。acpid將查看這些配置目錄(默認爲:/etc/acpi/events,並且分析所有的不以“.”爲開始文件。每個文件必須有兩個特徵:一個事件和一個動作。任何的空白行和帶“#”爲開頭的字符的行將被忽略。無關的行內容將標記警告,但不是致命的。每個行有三個標識:鍵值,等號和值。鍵值能夠是除了空格長達63個的字符,並且是不區分大小寫的。值能夠是長達511個的字符、案例和空格


事件值是一個規則表達(see regcomp(3)),這個事件值是否符合規則。


動作值是一個命令行,如果這個動作值符合規則,在發生這個命令的時候將調用/bin/sh。命令行可以包括專用的shell字符,並且它們將被保存。動作值裏唯一避免使用的專用字符是“%”。動作值裏的事件被調用時,“%e”將被字母文本事件代替。

這些字符串可以包含空格,所以,如果想要單獨的標識,命令行必須取消“%e”。動作值裏的事件被調用時,“%e”將取代字母文本。這些字符串可以包含空格,如果需要單個標識,命令行必須引用“%e”。字符串“%%”將代替字符“%”。所有其他的“%”被換碼保留,並將因爲規則不能加載。


這種特徵允許多個規則被定義爲同一事件(雖然沒有保準書),以及一個規則被定義爲多個事件。強迫向acpid刷新規則配置,發送它一個 SIGHUP


在一個附加的規則文件中,acpid也能接受一個在UNIX下的套接字(默認爲:/var/run/acpid.socket)。任何的應用可以連接這個套接字。一次連接,acpid將發送所有的ACPI事件文件到客戶端。客戶端有責任過濾信息,並得到有需要的信息。除了SIGHUP或則acpid退出的情況,acpid將不關閉客戶端套接字


acpid將記錄所有的活動,以及stdoutstderr的任何動作到日記文件(/var/log/acpid by default)。


所有的默認文件和目錄可以被命令行選項改變。


選項:

-c--confdir directory

這個選項改變了acpid規則配置文件的目錄。默認是:/etc/acpi/events


-d--debug

這個選項增加了acpid調試等級。如果調試等級非零,acpid將在前臺運行,並將日記指向stdout/stderr,而不是一個日記文件。


-e--eventfile filename

這個選項從acpid讀取事件並改變事件文件。默認是:/proc/acpi/event


-g--socketgroup groupname

這個選項改變LINUX套接字組的權限,並由acpid發佈事件。


-l--logfile filename

這個選項改變日記文件,並由acpid寫入。默認是:/var/log/acpid


-m--socketmode mode

這個選項改變UNIX套接字的權限,並由acpid發佈事件。默認爲: 0666


-s--socketfile filename

這個選項改變UNIX套接字的名字,並由acpid打開。默認爲:/var/run/acpid.socket


-S--nosocket filename

這個選項告訴acpid不能打開UNIX套接字。這個選項覆蓋了-s選項的功能,並否認了其他所有的套接字選項。


-v--version

顯示版本信息並退出。


-h--help

顯示幫助並退出。


例子:

這個例子“placed in /etc/acpi/events/power”如果你按下電源按鈕,將關閉你的系統


event=button/power.*

action=/usr/local/sbin/power.sh "%e"


這個小型程序“power.sh”獲得訪問,並將查看完成字符串,像參數:$L


備註:

請確認你最近使用的合適ACPI代碼。這些有效的來自:http://developer.intel.com/technology/iapc/acpi/downloads.htm.


文件:

/proc/acpi/event

/etc/acpi/

/var/log/acpid

/var/run/acpid.socket



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章