我有一个简单的脚本/lib/systemd/system-sleep/start_my_lock
,它在系统挂起时不会运行,我试图将 i3lock 设为我的默认锁
#!/bin/bash
case $1 in
pre)
scrot /home/jappatel/tmp/screen.png
convert /home/jappatel/tmp/screen.png -scale 10% -scale 1000% /home/jappatel/tmp/screen.png
convert /home/jappatel/tmp/screen.png /home/jappatel/Pictures/Icons/lock.png -gravity center -composite -matte /home/jappatel/tmp/screen.png
i3lock -i /home/jappatel/tmp/screen.png
rm /home/jappatel/tmp/screen.png
;;
esac
答案1
解决方案,我必须在本地用户而不是 root 用户上运行该脚本
su jappatel -c <command>
并运行并指定使用显示
DISPLAY=:0
我的最终剧本
#!/bin/bash
case $1 in
pre)
su jappatel -c "
DISPLAY=:0 scrot /home/jappatel/tmp/screen.png;
convert /home/jappatel/tmp/screen.png -scale 10% -scale 1000% /home/jappatel/tmp/screen.png;
convert /home/jappatel/tmp/screen.png /home/jappatel/Pictures/Icons/lock.png -gravity center -composite -matte /home/jappatel/tmp/screen.png;
DISPLAY=:0 i3lock -i /home/jappatel/tmp/screen.png;
rm /home/jappatel/tmp/screen.png"
;;
esac
答案2
依赖于显示服务器或用户会话的工具喜欢scrot
或i3lock
不能从后台系统脚本工作,因为它们找不到显示服务器和/或用户会话。
解决方案
DISPLAY
在使用以下任一方式调用这些工具之前,您需要设置环境变量
export DISPLAY=:0
或者
DISPLAY=:0 <COMMAND>
如果出于某种原因DISPLAY
应该有不同的值,请根据需要进行调整。您可以检查当前的使用 图形会话内部的值echo "$DISPLAY"
。
有关非常相似问题的更多信息,请参阅如何从 cron 启动 GUI 应用程序?
测试
您可以测试脚本是否能够在没有会话相关环境变量的情况下运行,方法是在脚本调用前加上前缀env -i
,例如
env -i /lib/systemd/system-sleep/start_my_lock
清空环境变量列表。