ฉันจะรับการแจ้งเตือนบนหน้าจอโดยใช้แจ้งเตือนเมื่อฉันเสียบ / ถอดปลั๊กเครื่องชาร์จได้อย่างไร
ฉันจะรับการแจ้งเตือนบนหน้าจอโดยใช้แจ้งเตือนเมื่อฉันเสียบ / ถอดปลั๊กเครื่องชาร์จได้อย่างไร
คำตอบ:
การสลับระหว่างไฟฟ้ากระแสสลับและพลังงานแบตเตอรี่ควรสร้างเหตุการณ์บนบัสระบบD-Bus เรียกใช้dbus-monitor --system
และดูว่ามีกิจกรรมใดบ้างที่สร้างขึ้นในระบบของคุณ
ถ้าคุณมีupowerupower -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 นี้เพื่อใช้ dbus แทน udev บันทึกเป็น.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
ด้วยเครื่องมือจัดการการแสดงผลเช่น gdm
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
ทางเลือกที่ดี? เพราะมันขึ้นอยู่กับการตรวจสอบหลายระบบย่อย นอกจากนี้ยังให้คำสั่งที่ง่ายพอที่จะทำงานด้วย - ผลลัพธ์เป็นจริงหรือเท็จ
ดังนั้นเราจึงมีเครื่องมือตรวจจับการปรากฏตัว แต่สิ่งที่เกี่ยวกับตรรกะ? เราต้องสำรวจสถานะและตรวจสอบการเปลี่ยนแปลงในรัฐ สิ่งที่เราสามารถทำได้คือการเก็บสถานะทางออกของon_ac_power
และเปรียบเทียบสถานะปัจจุบันกับสิ่งที่เราบันทึกไว้อย่างต่อเนื่องเมื่อมีการเปลี่ยนแปลง - ส่งการแจ้งเตือนบันทึกสถานะอีกครั้งและทำการเปรียบเทียบอีกครั้งวนซ้ำ แนวคิดพื้นฐานคือการใช้ธง
ในระยะสั้นเราเริ่มต้นภาพรวมของรัฐและจากนั้นสำรวจความคิดเห็นอย่างต่อเนื่องสำหรับการเปลี่ยนแปลงจากภาพรวม; เมื่อมีการเปลี่ยนแปลงเกิดขึ้น - แจ้งและรีเซ็ตสแนปชอต