충전기를 꽂거나 뽑을 때 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 솔루션이 알림을 너무 많이 보냈다고보고했습니다. 나는 이것을 재현 할 수 없었지만 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
이름이 지정된 파일을 만듭니다 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 어댑터가 있는지 어떻게 확인합니까?"입니다. 그리고 "우리는 어떻게 변화를 감지합니까?"
글쎄,이 문제는 다른 개발자에 의해 오래 전에 해결되었습니다. 우분투라는 스크립트와 기본적으로 제공 on_ac_power 에 저장된다 /usr/bin/on_ac_power
. 커널의 다른 하위 시스템 (ACPI 또는 APM)에서 전원 어댑터를 언급 할 수 있지만이 스크립트를 사용하면 작업이 단순 해집니다. 종료 상태 만 리턴하므로 if
명령문 에 사용하기에 적합 합니다.
왜 on_ac_power
좋은 선택입니까? 여러 서브 시스템 점검에 의존하기 때문입니다. 또한 작업하기에 충분한 간단한 명령을 제공합니다. 결과는 true 또는 false입니다.
따라서 존재 감지 도구가 있지만 논리는 어떻습니까? 존재를 폴링하고 상태의 변화를 감지해야합니다. 우리가 할 수있는 일은 종료 상태를 저장 on_ac_power
하고 현재 상태와 저장된 상태를 지속적으로 비교하는 것입니다. 일단 변경되면 알림을 보내고 상태를 다시 저장하고 다시 비교하고 반복합니다. 기본 아이디어는 플래그를 사용하는 것입니다.
즉, 상태의 스냅 샷을 초기화 한 다음 스냅 샷에서 변경 사항을 지속적으로 폴링합니다. 일단 변경이 발생하면 스냅 샷을 알리고 재설정하십시오.