再開後および画面ロック解除後にスクリプトを実行する方法


13

Ubuntu 12.04 LTSでは、サスペンドから再開した後、デスクトップのロックを解除した後にスクリプトを実行したいと思います。これらは、ユーザーとして実行し、myにアクセスする必要があります$DISPLAY

特に、私はしたい

  • バグ985028を回避nm-appletするために再起動します
  • を使用してカスタム通知を表示する notify-send
  • これらが機能するようになると、おそらく他のものが

再開すると、スクリプト/etc/pm/sleep.d/が実行されますが、画面とユーザー名を知らなくてもルートとして実行されます。これらのスクリプトでユーザー名とexportデフォルトをハードコーディングすればうまくいくかもしれませんDISPLAY :0が、それは非常にいハックのように感じます。

スクリプトは~/.config/autostart/xyz.desktopログイン後に実行されますが、再開後に画面のロックを解除しただけでは実行されません。

再開後に画面のロックを解除した後にスクリプトを実行する方法はありますか?


ユーザー名をハードコーディングしないようにするにはusers、他に誰もログインしていないと仮定して、を使用できます。(または問題ではない)
-Sparhawk

回答:


9

とにかく前の答えでユーザー名をハードコーディングする必要があるように見えるので、誰かが簡単な修正を探している場合の/etc/pm/sleep.dの簡単なスクリプトを次に示します

#!/bin/bash 
case "$1" in
    hibernate|suspend)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on suspend"
        ;;
    thaw|resume)
        sudo -u USERNAME env DISPLAY=:0 zenity --info --text "do stuff on resume"
        ;;
esac

5

Unix&Linuxサイトのこの質問には、 dbusメッセージを使用した代替アプローチが記載されています。

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean true" &> /dev/null; then SCREEN_LOCKED; elif echo $X | grep "boolean false" &> /dev/null; then SCREEN_UNLOCKED; fi done )

(SCREEN_LOCKEDとSCREEN_UNLOCKEDを、実行するアクションに置き換えます。)

xrandr 1>/dev/null 2>1ロック解除のアクションとして使用すると、画面のロック解除時にモニターの解像度/位置が正しく復元されないという問題が修正されました(xrandrが画面設定の再読み取りを引き起こすようです)。この行をバックグラウンドタスクとして.bash_profileに追加しました(厳密には〜/ .config / autostartのデスクトップファイルとしてお勧めします。gnomeを起動したときにのみ実行されるためです)。

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | ( while true; do read X; if echo $X | grep "boolean false" &> /dev/null; then xrandr 1>/dev/null 2>1; fi done ) &

gnome-screensaver APIの詳細な背景については、このサイトおよびdbusモニターをご覧ください


1

1つの解決策は、デスクトップへのログイン時に実行され、dbusメッセージをキャッチするスクリプトです。サスペンドから再開した後、画面はロックされ、パスワードを入力すると、dbusでUnlockイベントが発生します。

(私を正しい方向に導いてくれたKim SJに感謝します。ScreenSaver信号はありませんが、使用する別のインターフェイスが見つかりました)。

では~/.config/autostart/、bashスクリプトを開始する.desktopファイルがあります。

$ cat ~/.config/autostart/mymonitor.desktop
[Desktop Entry]
Categories=System;Monitor;
Comment=Monitor dbus for unlock signals
Exec=/usr/local/bin/unlock_monitor
Name=unlock_monitor
Type=Application

unlock_monitor監視スクリプトからdbusのメッセージを読み込みcom.canonical.Unity.Sessionと上のものを行いUnlocked信号:

#!/bin/bash

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session" --profile \
| while read dbusmsg; do
    if [[ "$dbusmsg" =~ Unlocked$ || "$dbusmsg" =~ NameAcquired$ ]] ; then
        sleep 5
        notify-send "$(basename $0)" "Unlocked or freshly logged in..."
        # ...
    fi
done

ログインするとき、「ロック解除」シグナルはありませんが、dbus-monitor開始時に「NameAcquired」シグナルがあります。


0

start-stop-daemonを使用してスクリプトを実行できます。start-stop-daemonは、異なるuidとgidとして実行されているスレッドをフォークできるため、問題を解決できます。

あなたがする必要があるのは、のようなシステムPATHに置かれたジョブスクリプトを書いて/usr/bin/etc/pm/sleep.d。またはデーモンスクリプトpm-suspendなどの一致するアクションは、次を介してジョブスクリプトをコミットしますresumethaw

start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script

どこにARGsある--chuid 1001:1001か、またはちょうど--user your_username

また、整合性を保つために、デーモンスクリプトで、nm-rtvtサスペンド前に指定されたデーモンを停止することもできます。

start-stop-daemon --stop <...>

またはなどの一致するpm-suspendアクション。suspendhibernate

詳細については、man start-stop-daemon。また/etc/init.d、デーモンスクリプトには他にも多くの例があります。

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