Làm cách nào tôi có thể nhận được thông báo bằng Notify-OSD khi cắm / tháo bộ sạc?


9

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?


Tôi có thể tạo một kịch bản để làm điều này .. nhưng đó không phải là một giải pháp rất thanh lịch.
Seth

@Seth Một kịch bản như vậy sẽ như thế nào? Bạn có thể gửi nó trong một câu trả lời? Tôi đặc biệt quan tâm đến cách bạn xác định một sự kiện "rút phích cắm" ...
Landroni

@landroni Ồ, không nhận ra bạn không phải là OP. Tôi đã đăng một câu trả lời dưới đây. Nó hoạt động tốt với tôi nhưng một vài người bạn của tôi đang gặp vấn đề. Hãy cho tôi biết nếu nó không làm việc cho bạn. Tôi đang làm việc theo cách tốt hơn khi chúng ta nói chuyện.
Seth

@Seth Cảm ơn rất nhiều vì đã xem xét điều này. Khi điều đó xảy ra, pin của tôi đã chết trong một cái chết rất nhanh, do đó, truy vấn của tôi bây giờ hơi khó khăn. Nhưng tôi sẽ ghi nhớ giải pháp này cho tương lai.
Landroni

Câu trả lời:


6

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 --systemvà 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.


6

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

xe buýt

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 .pytậ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()

udev

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_userbằ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.shbằ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.dcó tên 10-power.rulesvớ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.shbằ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.


Điều đó hoạt động, nhưng nó đòi hỏi quyền truy cập root và máy móc phức tạp để nhận thông báo đến máy tính để bàn hoặc mã hóa cứng người dùng như bạn đã làm. Tôi nghĩ bạn cũng sẽ cần phải thiết lậpXAUTHORITY với một số trình quản lý hiển thị như gdm.
Gilles 'SO- đừng trở nên xấu xa'

@Gilles IMO "yêu cầu root" và người dùng được mã hóa cứng là những nitpicks khá ngớ ngẩn, nhưng tôi sẽ thêm một giải pháp cron sau này để hoàn thiện nếu bạn nghĩ nó quan trọng. Tôi khá là hoạt động theo GDM nhưng tôi sẽ kiểm tra lại.
Seth

1
Tôi cũng đang xem API nhắn tin dbus của python-dbus và udev để có thể tạo ra một daemon sẽ làm điều tương tự như các quy tắc udev này, nhưng vấn đề duy nhất là nó sẽ cần phải liên tục chạy và khởi động lại bất kỳ thất bại, một cái gì đó mà tôi tin rằng thêm một mức độ phức tạp cao hơn cho một giải pháp khá tốt. Tuy nhiên, nếu có bất kỳ giải pháp nào tốt hơn, tôi rất vui khi nghe chúng.
joshumax

Không phải ai cũng chạy Ubuntu như một hệ thống người dùng. Cron không hữu ích ở đây. Tôi biết bạn cần thêm bước tìm kiếm vị trí của tệp cookie X phiên bản cũ hơn của Gdm, tôi không biết về các phiên bản gần đây nhưng tôi nghĩ điều này đã không thay đổi. Vấn đề tương tự với KDM . @joshumax Bạn có thể lấy thông tin từ các nguồn khác, và thậm chí thông qua dbus, bạn có thể làm điều đó từ shell với dbus-monitor. Xem câu trả lời của tôi.
Gilles 'SO- ngừng trở nên xấu xa'

2

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:

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

  3. git clone https://github.com/SergKolo/sergrep.git

Kịch bản sẽ có trong /opt/sergrepthư 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?" "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 ifcâu lệnh.

Tại sao là on_ac_powersự 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_powervà 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.