Ubuntu 12.04 LTSでは、サスペンドから再開した後、デスクトップのロックを解除した後にスクリプトを実行したいと思います。これらは私の$DISPLAY
へのアクセス権を持つユーザーとして実行する必要があります。
特に、私はしたい
nm-applet
を再起動して回避してください バグ985028notify-send
を使用してカスタム通知を表示します再開すると、/etc/pm/sleep.d/
のスクリプトが実行されますが、画面とユーザー名を知らなくてもrootとして実行されます。これらのスクリプトでユーザー名とexport
をデフォルトのDISPLAY :0
にハードコーディングするとうまくいくかもしれませんが、それは非常にいハックのように感じます。
~/.config/autostart/xyz.desktop
のスクリプトはログイン後に実行されますが、再開後に画面のロックを解除しただけでは実行されません。
再開後に画面のロックを解除した後にスクリプトを実行する方法はありますか?
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」シグナルがあります。
とにかく以前の回答でユーザー名をハードコーディングする必要があるように見えるので、誰かが簡単な修正を探している場合は/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
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モニター ここ を参照してください。
Start-stop-daemonを使用してスクリプトを実行できます。 start-stop-daemonは、異なるuidとgidとして実行されているスレッドをフォークできるため、問題を解決できます。
必要なことは、/usr/bin
のようなシステムPATHに配置されたジョブスクリプトを記述し、/etc/pm/sleep.d
に追加のデーモンスクリプトを作成することです。 resume
やthaw
などの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 <...>
suspend
やhibernate
などのpm-suspend
アクションに一致します。
詳細については、man start-stop-daemon
。また、デーモンスクリプトの/etc/init.d
には他にも多くの例があります。