जब मैं चार्जर को प्लग / अनप्लग करता हूं, तो मैं नोटिफ़िकेशन-ओएसडी का उपयोग करके ऑन-स्क्रीन अधिसूचना कैसे प्राप्त कर सकता हूं?
जब मैं चार्जर को प्लग / अनप्लग करता हूं, तो मैं नोटिफ़िकेशन-ओएसडी का उपयोग करके ऑन-स्क्रीन अधिसूचना कैसे प्राप्त कर सकता हूं?
जवाबों:
एसी पावर और बैटरी पावर के बीच स्विच करने से डी-बस सिस्टम बस पर एक घटना उत्पन्न होनी चाहिए । चलाएं dbus-monitor --system
और देखें कि आपके सिस्टम पर कौन सी घटनाएं उत्पन्न होती हैं।
यदि आपके पास अपवर चल रहा है, तो आपको और विशेष सूचनाएं प्राप्त होंगी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
इस स्क्रिप्ट को तब चलाएं जब आप सूचनाएं देखना शुरू करना चाहते हैं, या इसे अपने सत्र स्टार्टअप में जोड़ना चाहते हैं।
कुछ लोगों ने रिपोर्ट किया कि मेरे पहले के udv समाधान ने कई बार अधिसूचना भेजी थी जब पावर केबल को प्लग किया गया था। मैं इसे पुन: पेश नहीं कर सका, लेकिन मैंने udv के बजाय 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()
थोड़ा प्रयोग (और थोड़ी मदद) के साथ मैं इसे पूरा करने के लिए एक udv नियम का उपयोग करने में सक्षम था । कुछ लोगों ने बताया है कि यह कभी-कभी अधिसूचना को एक से अधिक बार भेजता है लेकिन मुझे कोई समस्या नहीं हुई है। 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
आपके द्वारा पहले बनाई गई स्क्रिप्ट के पथ के साथ फिर से प्रतिस्थापित करना।
अब चलकर udv नियमों को फिर से लोड करें:
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
स्क्रिप्ट मिल रही है
स्क्रिप्ट को मेरे गितुब में भी जोड़ा गया है ; उस संस्करण को अद्यतन किया जाएगा और एक छोटे से अधिक विकसित किया जाएगा।
आप इसे निम्न करके प्राप्त कर सकते हैं:
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
स्क्रिप्ट /opt/sergrep
डायरेक्टरी में होगी , जिसका नाम हैnotify_ac_change.sh
संकल्पना रचना
प्रमुख प्रश्न हैं "हम एसी एडाप्टर की उपस्थिति की जांच कैसे करते हैं?" और "हम परिवर्तनों का पता कैसे लगाते हैं?"
खैर, इस मुद्दे को अन्य डेवलपर्स द्वारा बहुत पहले हल किया गया है। उबंटू डिफ़ॉल्ट रूप से on_ac_power नामक एक स्क्रिप्ट के साथ आता है , जिसे अंदर संग्रहीत किया जाता है /usr/bin/on_ac_power
। पावर एडाप्टर को कर्नेल (एसीपीआई या एपीएम) में अलग-अलग उप प्रणालियों के तहत उल्लेख किया जा सकता है, लेकिन यह स्क्रिप्ट हमारे काम को सरल बनाती है - लेखकों ने बहुत सारे संभावित बदलावों को कवर किया है। यह केवल निकास स्थिति लौटाता है इसलिए यह if
बयानों में उपयोग के लिए उपयुक्त है ।
on_ac_power
अच्छा विकल्प क्यों है ? क्योंकि यह कई सबसिस्टम की जाँच पर निर्भर करता है। यह काम करने के लिए सरल पर्याप्त आदेश भी प्रदान करता है - परिणाम या तो सच है या गलत है।
इस प्रकार हमारे पास उपस्थिति का पता लगाने वाला उपकरण है, लेकिन तर्क के बारे में क्या? हमें राज्य में उपस्थिति का पता लगाने और परिवर्तन का पता लगाने की आवश्यकता है। हम क्या कर सकते हैं बाहर निकलने की स्थिति को स्टोर करने के लिए on_ac_power
और वर्तमान स्थिति की तुलना करें कि हमने क्या बचाया है, एक बार जब यह बदल जाता है - अधिसूचना भेजें, स्थिति को फिर से सहेजें, और फिर से तुलना करते रहें, लूपिंग। मूल विचार झंडे का उपयोग है।
संक्षेप में, हम राज्य के एक स्नैपशॉट को आरंभीकृत करते हैं, और फिर स्नैपशॉट से परिवर्तन के लिए लगातार चुनाव करते हैं; एक बार परिवर्तन होने पर - स्नैपशॉट को सूचित और रीसेट करें।