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


13

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

我特别想

  • 重新启动nm-applet以解决错误985028
  • 使用显示自定义通知 notify-send
  • 当我工作时可能还有其他东西

当我继续/etc/pm/sleep.d/执行时,运行中的脚本,但是它们以root身份运行,而不需要我的屏幕和用户名。如果我在这些脚本中硬编码我的用户名和export默认名称,这可能会起作用DISPLAY :0,但这听起来很丑陋。

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

恢复简历后解锁屏幕后,是否可以运行脚本?


要不对用户名进行硬编码,可以使用users,假设没有其他人登录。(或不要紧)
Sparhawk

Answers:


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

一种解决方案是在登录桌面时运行的脚本,该脚本捕获dbus消息。从挂起状态恢复后,屏幕被锁定,输入密码后,dbus上发生一个Unlock事件。

(感谢Kim SJ将我带入正确的轨道。我没有ScreenSaver信号,但是找到了另一个要使用的接口)。

在中~/.config/autostart/,我有一个.desktop文件,该文件启动bash脚本:

$ 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

登录时,没有“ Unlocked”信号,但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守护程序脚本中还有许多其他示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.