Làm cách nào tôi có thể nhận được thông báo trên màn hình bằng cách sử dụng notify-osd khi tôi cắm / rút bộ sạc?
Làm cách nào tôi có thể nhận được thông báo trên màn hình bằng cách sử dụng notify-osd khi tôi cắm / rút bộ sạc?
Câu trả lời:
Chuyển đổi giữa nguồn AC và nguồn pin sẽ tạo ra một sự kiện trên xe buýt hệ thống D-Bus . Chạy dbus-monitor --system
và xem những sự kiện được tạo ra trên hệ thống của bạn.
Nếu bạn có upower đang chạy, bạn sẽ nhận được nhiều thông báo chuyên biệt hơn từ 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
Bạn cũng có thể nhận được các sự kiện từ acpi_listen
.
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
Chạy tập lệnh này khi bạn muốn bắt đầu thấy thông báo hoặc thêm nó vào phần khởi động phiên của mình.
Một số người báo cáo giải pháp udev trước đây của tôi đã gửi thông báo quá nhiều lần khi cắm cáp nguồn. Tôi không thể sao chép điều đó nhưng tôi đã viết kịch bản python này để sử dụng dbus thay vì udev. Lưu nó dưới dạng một .py
tập tin ở đâu đó trên ổ cứng của bạn. Đánh dấu tập tin thực thi bằng cách chạy:
sudo chmod +x yourFile.py
và thêm nó vào các ứng dụng khởi động của bạn như được mô tả ở đây . Kịch bản này yêu cầu gói acpi
được cài đặt.
#!/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()
Với một chút thử nghiệm (và một chút giúp đỡ) tôi đã có thể sử dụng quy tắc udev để thực hiện điều này. Một số người đã báo cáo rằng đôi khi nó gửi thông báo nhiều lần nhưng tôi không gặp vấn đề gì. YMMV.
Tạo một kịch bản với các nội dung sau:
#!/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
thay thế some_user
bằng tên người dùng của bạn. Đánh dấu tập tin thực thi bằng cách chạy:
sudo chmod +x /path/to/script.sh
thay thế /path/to/script.sh
bằng đường dẫn đến nơi bạn đã lưu tập lệnh.
Tiếp theo tạo một tệp /etc/udev/rules.d
có tên 10-power.rules
với nội dung:
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"
một lần nữa thay thế /path/to/script.sh
bằng đường dẫn đến kịch bản bạn đã tạo trước đó.
Bây giờ tải lại các quy tắc udev bằng cách chạy:
sudo udevadm control --reload-rules
Rút cáp nguồn. Bạn sẽ nhận được một thông báo.
XAUTHORITY
với một số trình quản lý hiển thị như gdm.
dbus-monitor
. Xem câu trả lời của tôi.
Nguồn kịch bản
#!/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
Lấy kịch bản
Kịch bản cũng được thêm vào github của tôi ; phiên bản đó sẽ được cập nhật và phát triển thêm một chút nữa.
Bạn có thể có được nó bằng cách làm như sau:
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
Kịch bản sẽ có trong /opt/sergrep
thư mục, được đặt tênnotify_ac_change.sh
Khái niệm / Thiết kế
Các câu hỏi chính là "Làm thế nào để chúng tôi kiểm tra sự hiện diện của bộ chuyển đổi AC?" và "Làm thế nào để chúng tôi phát hiện các thay đổi?"
Vâng, vấn đề này đã được giải quyết từ lâu bởi các nhà phát triển khác. Ubuntu mặc định đi kèm với một tập lệnh gọi là on_ac_power , được lưu trữ trong /usr/bin/on_ac_power
. Bộ điều hợp nguồn có thể được đề cập dưới các hệ thống con khác nhau trong kernel (ACPI hoặc APM), nhưng tập lệnh này làm cho công việc của chúng tôi đơn giản hơn - các tác giả đã đề cập đến rất nhiều biến thể có thể có. Nó chỉ trả về trạng thái thoát để nó phù hợp để sử dụng trong các if
câu lệnh.
Tại sao là on_ac_power
sự lựa chọn tốt? Bởi vì nó dựa vào việc kiểm tra nhiều hệ thống con. Nó cũng cung cấp lệnh đủ đơn giản để làm việc với - kết quả là đúng hoặc sai.
Vì vậy, chúng tôi có công cụ phát hiện sự hiện diện, nhưng còn logic thì sao? Chúng ta cần thăm dò sự hiện diện và phát hiện sự thay đổi trong tiểu bang. Những gì chúng ta có thể làm là lưu trữ trạng thái thoát on_ac_power
và liên tục so sánh trạng thái hiện tại với những gì chúng ta đã lưu, một khi nó thay đổi - gửi thông báo, lưu lại trạng thái và tiếp tục so sánh lại, lặp lại. Ý tưởng cơ bản là sử dụng cờ.
Nói tóm lại, chúng tôi khởi tạo một ảnh chụp nhanh về trạng thái và sau đó liên tục thăm dò ý kiến để thay đổi từ ảnh chụp nhanh; một khi thay đổi xảy ra - thông báo và thiết lập lại ảnh chụp nhanh.