充電器の挿入/取り外し時にNotify-OSDを使用して通知を受け取るにはどうすればよいですか?


9

充電器を接続/取り外ししたときに、notify-osdを使用して画面上の通知を受け取るにはどうすればよいですか?


これを実行するスクリプトを作成することはできますが、それは非常にエレガントな解決策ではありません。
Seth

@Sethそのようなスクリプトはどのように見えますか?回答に投稿していただけませんか?「充電器が接続されていません」イベントを特定する方法に特に興味があります...
landroni

@landroniああ、あなたがOPではないことに気づきませんでした。以下に回答を掲載しました。それは私にとってはうまくいきますが、私の友人の何人かは問題を抱えています。うまくいかない場合はお知らせください。私たちが話しているより良い方法に取り組んでいます。
Seth

@Sethこれを調べてくれてありがとう。たまたま、バッテリーがすぐに切れてしまったので、今のところ私の質問は少し気がかりです。しかし、私はこのソリューションを将来のために覚えておきます。
landroni

回答:


6

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

通知の表示を開始するか、セッションのスタートアップに追加する場合は、このスクリプトを実行します。


6

ここに画像の説明を入力してください ここに画像の説明を入力してください

dbus

一部の人々は、私の以前のudevソリューションが電源ケーブルが接続されたときに何度も通知を送信したと報告しました。私はそれを再現できませんでしたが、このpythonスクリプトを作成して、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.dnamed 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                              

電源ケーブルを取り外します。通知が届きます。


これは機能しますが、ルートへのアクセスと、デスクトップに通知を取得するための複雑な機構、またはユーザーのハードコーディングが必要です。また、gdmなどのディスプレイマネージャーを設定XAUTHORITYする必要があると思います。
Gilles「SO-邪悪なことをやめなさい」

@Gilles IMOは「ルートが必要」であり、ハードコードされたユーザーはばかばかしい一口ですが、それが重要だと思われる場合は、完全を期すために後でcronソリューションを追加します。私はかなりこれがGDMで動作するようですが、再確認します。
セス

1
私はpython-dbusとudevのdbusメッセージングAPIも調べて、これらのudevルールと同じことを行うデーモンを作成している可能性がありますが、唯一の問題は、常に実行され、再起動する必要があることです。失敗、これはかなりまともなソリューションにさらに複雑さを加えると私は信じています。しかし、もっと良い解決策があれば、私はそれらを聞いてうれしいです。
joshumax 2015

誰もがUbuntuをシングルユーザーシステムとして実行しているわけではありません。cronはここでは役に立ちません。古いバージョンのGdmのX cookieファイルの場所を見つけるための追加の手順が必要だったと思います。最近のバージョンについてはわかりませんが、これは変更されていないと思います。KDMと同じ問題。@joshumax他のソースから情報を取得できます。dbusを使用していても、を使用してシェルから情報を取得できますdbus-monitor。私の答えを見てください。
Gilles「SO-邪悪なことをやめなさい」

2

スクリプトソース

#!/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アダプタの存在をどのように確認するか」です。そして、「どのように我々は変更を検出しますか?」

さて、この問題はずっと前に他の開発者によって解決されました。Ubuntuには、デフォルトでon_ac_powerというスクリプトが付属しており、に保存されてい/usr/bin/on_ac_powerます。電源アダプターは、カーネルのさまざまなサブシステム(ACPIまたはAPM)で言及できますが、このスクリプトにより、作業が簡単になります。作成者はさまざまなバリエーションをカバーしています。終了ステータスのみを返すため、ifステートメントでの使用に適しています。

なぜon_ac_power良い選択なのですか?複数のサブシステムのチェックに依存しているためです。また、操作するのに十分なほど単純なコマンドも提供します。結果はtrueまたはfalseのいずれかです。

したがって、存在検出ツールがありますが、ロジックはどうですか?プレゼンスをポーリングし、状態の変化を検出する必要があります。私たちができることは、終了ステータスをon_ac_power保存し、現在の状態を保存したものと継続的に比較することです。変更後は、通知を送信し、ステータスを再度保存し、ループを繰り返します。基本的な考え方は、フラグの使用です。

つまり、状態のスナップショットを初期化し、スナップショットからの変更を継続的にポーリングします。変更が発生したら、スナップショットに通知してリセットします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.