充電器を接続/取り外ししたときに、notify-osdを使用して画面上の通知を受け取るにはどうすればよいですか?
充電器を接続/取り外ししたときに、notify-osdを使用して画面上の通知を受け取るにはどうすればよいですか?
回答:
AC電源とバッテリー電源を切り替えると、D-Busシステムバスでイベントが生成されます。dbus-monitor --system
システムでどのイベントが生成されるかを実行して監視します。
upowerを実行している場合は、からより特殊な通知が届きますupower -m
。
#!/bin/sh
upower -m |
while read -r _time _2 _3 device; do
[ "$device" = "/org/freedesktop/UPower/devices/line_power_AC" ] || continue
notify-send "$(acpi -a)"
done
からイベントを取得することもできますacpi_listen
。
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
通知の表示を開始するか、セッションのスタートアップに追加する場合は、このスクリプトを実行します。
一部の人々は、私の以前のudevソリューションが電源ケーブルが接続されたときに何度も通知を送信したと報告しました。私はそれを再現できませんでしたが、このpythonスクリプトを作成して、udevの代わりにdbusを利用しました。.py
ハードドライブのどこかにファイルとして保存します。次のコマンドを実行して、実行可能ファイルをマークします。
sudo chmod +x yourFile.py
ここで説明するように、起動アプリケーションに追加します。このスクリプトでは、パッケージacpi
をインストールする必要があります。
#!/usr/bin/python
import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
import subprocess
dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)
onMessage="Power plugged in!"
offMessage="Power unplugged!"
onImage="/usr/share/icons/gnome/32x32/devices/ac-adapter.png"
offImage="/usr/share/icons/gnome/32x32/status/battery-full.png"
def callback():
state = subprocess.check_output(["acpi", "-a"]).split(':')[1].strip()
if state == "on-line":
subprocess.call(["notify-send", "-i", onImage, onMessage])
elif state == "off-line":
subprocess.call(["notify-send", "-i", offImage, offMessage])
bus.add_signal_receiver(callback, 'Changed', 'org.freedesktop.UPower.Device', 'org.freedesktop.UPower', '/org/freedesktop/UPower/devices/line_power_AC')
loop = gobject.MainLoop()
loop.run()
少し実験して(そして少し助けて)、udevルールを利用してこれを達成することができました。一部の人々は、それが時々通知を複数回送信すると報告しましたが、私は何の問題もありませんでした。YMMV。
次の内容のスクリプトを作成します。
#!/bin/bash
# Set this to your username
USER="some_user"
if [ "$POWER" == "on" ]
then
DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/devices/ac-adapter.png "Power cable plugged in."'
elif [ "$POWER" == "off" ]
then
DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/status/battery-full.png "Power cable unplugged."'
fi
some_user
ユーザー名に置き換えます。次のコマンドを実行して、実行可能ファイルをマークします。
sudo chmod +x /path/to/script.sh
/path/to/script.sh
スクリプトを保存した場所へのパスに置き換えます。
次に、/etc/udev/rules.d
named 10-power.rules
に内容を含むファイルを作成します。
SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="0", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="off"
SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="1", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="on"
もう一度、/path/to/script.sh
前に作成したスクリプトへのパスに置き換えます。
次のコマンドを実行して、udevルールをリロードします。
sudo udevadm control --reload-rules
電源ケーブルを取り外します。通知が届きます。
XAUTHORITY
する必要があると思います。
dbus-monitor
。私の答えを見てください。
スクリプトソース
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com
# Date: March 11, 2016
# Purpose: Script to detect connection/disconnection
# of the ac adapter
#
#
# Written for: http://askubuntu.com/q/542986/295286
# Tested on: Ubuntu 14.04 LTS
# Version: 0.2
###########################################################
# Copyright: Serg Kolo , 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#set -x
ARGV0="$0"
ARGC=$#
test_presence()
{
on_ac_power
echo $?
}
notify_change()
{
pgrep -f '/usr/bin/X' > /dev/null && GUI=true
connected='AC adapter connected'
disconnected='AC adapter disconnected'
if [ $1 -eq 0 ]
then
wall <<< $connected
$GUI && DISPLAY=:0 notify-send 'AC adapter connected'
else
wall <<< $connected
$GUI && DISPLAY=:0 notify-send 'AC adapter disconnected'
fi
}
main()
{
FLAG=$(test_presence)
while true
do
STATUS=$(test_presence)
if [ $STATUS -eq $FLAG ]
then
continue
else
notify_change $STATUS
FLAG=$STATUS
fi
sleep 3 #0.25
done
}
main
スクリプトを取得する
スクリプトも私のgithubに追加されます。そのバージョンは更新され、もう少し開発されます。
次の方法で取得できます。
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
スクリプトは/opt/sergrep
、次の名前のディレクトリにありますnotify_ac_change.sh
コンセプトデザイン
重要な質問は、「ACアダプタの存在をどのように確認するか」です。そして、「どのように我々は変更を検出しますか?」
さて、この問題はずっと前に他の開発者によって解決されました。Ubuntuには、デフォルトでon_ac_powerというスクリプトが付属しており、に保存されてい/usr/bin/on_ac_power
ます。電源アダプターは、カーネルのさまざまなサブシステム(ACPIまたはAPM)で言及できますが、このスクリプトにより、作業が簡単になります。作成者はさまざまなバリエーションをカバーしています。終了ステータスのみを返すため、if
ステートメントでの使用に適しています。
なぜon_ac_power
良い選択なのですか?複数のサブシステムのチェックに依存しているためです。また、操作するのに十分なほど単純なコマンドも提供します。結果はtrueまたはfalseのいずれかです。
したがって、存在検出ツールがありますが、ロジックはどうですか?プレゼンスをポーリングし、状態の変化を検出する必要があります。私たちができることは、終了ステータスをon_ac_power
保存し、現在の状態を保存したものと継続的に比較することです。変更後は、通知を送信し、ステータスを再度保存し、ループを繰り返します。基本的な考え方は、フラグの使用です。
つまり、状態のスナップショットを初期化し、スナップショットからの変更を継続的にポーリングします。変更が発生したら、スナップショットに通知してリセットします。