글쓴이 보관물: 소장 마

충전기를 삽입 / 제거 할 때 Notify-OSD를 사용하여 알림을 받으려면 어떻게해야합니까? 꽂거나 뽑을 때 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

알림 표시를 시작하거나 세션 시작에 추가하려는 경우이 스크립트를 실행하십시오.


답변

dbus

일부 사람들은 전원 케이블을 꽂았을 때 이전의 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

약간의 실험 (그리고 약간의 도움)으로 나는 이것을 달성 하기 위해 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

전원 케이블을 뽑습니다. 알림을 받아야합니다.


답변

스크립트 소스

#!/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에 추가됩니다 . 그 버전은 조금 더 업데이트되고 개발 될 것입니다.

다음을 수행하여 얻을 수 있습니다.

  1. sugo apt-get install git
  2. cd /opt

  3. 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하고 현재 상태와 저장된 상태를 지속적으로 비교하는 것입니다. 일단 변경되면 알림을 보내고 상태를 다시 저장하고 다시 비교하고 반복합니다. 기본 아이디어는 플래그를 사용하는 것입니다.

즉, 상태의 스냅 샷을 초기화 한 다음 스냅 샷에서 변경 사항을 지속적으로 폴링합니다. 일단 변경이 발생하면 스냅 샷을 알리고 재설정하십시오.


답변