我有一个代码片段来自(unix.stackexchange.com - 在屏幕锁定/解锁时运行脚本) 我计划修改它,因为 PulseAudio 的“未记录的功能”会在屏幕锁定时将声音从电视切换到笔记本电脑。
代码非常简单:
dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
while true; do
read X
if echo $X | grep "desktop-lock" &> /dev/null; then
SCREEN_LOCKED;
elif echo $X | grep "desktop-unlock" &> /dev/null; then
SCREEN_UNLOCKED;
fi
done
)
我不能说我真正理解程序/子程序自上而下的流程或循环,但这里的某个人评论说它有效,我相信他的判断。
问题是我的脚本的命名约定是什么?将脚本放在哪个行业标准目录?我如何调用它?即启动应用程序、rc.local、cron @reboot 等。调用后,我相信它会运行到下次重启。
即使它只在每个星期三的洗衣晚上使用,它也会永远运行,因此理想情况下它不应该占用太多的 CPU 周期。
答案1
剧本
正如评论中提到的那样,发布了一个略微改进的版本这里(在@Serg 和@muru 的帮助下):
dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
while read X; do
if [[ "$X" =~ desktop-lock ]]; then
SCREEN_LOCKED;
elif [[ "$X" =~ desktop-unlock ]]; then
SCREEN_UNLOCKED;
fi
done
)
存放在哪儿?
你可以将它存储在你的$HOME
目录中的任何你喜欢的地方,如果它只供你的用户使用,或者在/usr/本地/bin如果您希望其他用户也可以使用它。
什么时候跑?
dbus-monitor 在本地运行。因此,我只需将脚本添加到启动应用程序:Dash > 启动应用程序 > 添加。添加运行脚本的命令,最好使其可执行,然后只需添加命令:
/path/to/script
有可能,由于脚本涉及 GUI,因此您需要等到 UI 完全加载。在这种情况下,请使用:
/bin/bash -c "sleep 10 && /path/to/script"
笔记
脚本所做的只是等待状态改变,监听系统上进程之间的通信。它不会添加任何会给您的系统带来明显的负担。
答案2
这对我在 Ubuntu 18.04 和 Unity 上有用
#!/bin/bash
dbus-monitor --session "type='signal',interface='com.canonical.Unity.Session'" | \
(
# optional: prevent consecutive unlocks/locks
locked=0
while true; do
read X
echo "$X"
if echo "$X" | grep "member=Locked" &> /dev/null; then
if [ $locked -eq 0 ]; then
echo "Screen locked"
locked=1
fi
elif echo "$X" | grep "member=Unlocked" &> /dev/null; then
if [ $locked -eq 1 ]; then
echo "Screen unlocked"
locked=0
fi
fi
done
)
当使用 Gnome 时,第二行应该替换为
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
并将grep后面引号之间的内容分别替换为“boolean true”和“boolean false”。
将此脚本添加到启动应用程序中,它将在您第一次登录时开始工作。