充電器のプラグを抜くときに、notify-osdを使用して画面上の通知を取得するにはどうすればよいですか?
AC電源とバッテリー電源を切り替えると、 D-Bus システムバスでイベントが生成されます。 dbus-monitor --system
を実行して、システムで生成されるイベントを確認します。
power を実行している場合、 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
このスクリプトは、通知の表示を開始するときに実行するか、セッションのスタートアップに追加します。
スクリプトソース
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected]
# 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
スクリプトの取得
スクリプトはmy 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
の終了ステータスを保存し、変更後、現在の状態を保存したものと継続的に比較します。通知を送信し、ステータスを再度保存し、ループを繰り返します。基本的な考え方は、フラグの使用です。
つまり、状態のスナップショットを初期化し、スナップショットからの変更を継続的にポーリングします。変更が発生したら-スナップショットを通知してリセットします。