如何在恢复后和解锁屏幕后运行脚本
在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
动作,如resume
或thaw
守护进程脚本,通过提交作业脚本
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
动作,如suspend
或hibernate
。
有关详细信息,请使用man start-stop-daemon
。 守护脚本的/etc/init.d
中还有许多其他示例。