如何在恢复后和解锁屏幕后运行脚本

在Ubuntu 12.04 LTS中,我想在从暂停状态恢复后以及解锁桌面后运行脚本。 这些需要以我的用户身份运行,并且可以访问我的$DISPLAY

特别是,我想

  • 重启nm-applet以解决bug 985028
  • 使用notify-send显示自定义通知
  • 当我得到这些工作时可能还有其他东西

当我恢复时,运行/etc/pm/sleep.d/中的脚本,但它们以root身份运行,不知道我的屏幕和用户名。 如果我硬编码我的用户名并在这些脚本中export默认的DISPLAY :0 ,它可能会有效,但这感觉就像一个非常难看的黑客。

~/.config/autostart/xyz.desktop脚本在登录后运行,但仅在恢复后解锁屏幕后才会运行。

恢复后解锁屏幕后有没有办法运行脚本?

看起来你必须在上一个答案中硬编码用户名,所以这里是/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 

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监视器。

一种解决方案是在登录桌面时运行并捕获dbus消息的脚本。 从暂停恢复后屏幕被锁定,输入密码后,dbus上有一个解锁事件。

(感谢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消息, 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”信号。

您可以使用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中还有许多其他示例。