web-dev-qa-db-ja.com

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

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

特に、私はしたい

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

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

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

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

13
mivk

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モニタースクリプトは、com.canonical.Unity.Sessionからdbusメッセージを読み取り、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
mivk

とにかく以前の回答でユーザー名をハードコーディングする必要があるように見えるので、誰かが簡単な修正を探している場合は/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
9
aaron-bru

nix&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モニター ここ を参照してください。

4
Kim SJ

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

必要なことは、/usr/binのようなシステムPATHに配置されたジョブスクリプトを記述し、/etc/pm/sleep.dに追加のデーモンスクリプトを作成することです。 resumethawなどのpm-suspendアクションに一致すると、デーモンスクリプトは次を介してジョブスクリプトをコミットします。

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

suspendhibernateなどのpm-suspendアクションに一致します。

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

0
funicorn