系统睡眠脚本未执行

系统睡眠脚本未执行

我有一个简单的脚本/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

依赖于显示服务器或用户会话的工具喜欢scroti3lock不能从后台系统脚本工作,因为它们找不到显示服务器和/或用户会话。

解决方案

DISPLAY在使用以下任一方式调用这些工具之前,您需要设置环境变量

export DISPLAY=:0

或者

DISPLAY=:0 <COMMAND>

如果出于某种原因DISPLAY应该有不同的值,请根据需要进行调整。您可以检查当前的使用 图形会话内部的值echo "$DISPLAY"

有关非常相似问题的更多信息,请参阅如何从 cron 启动 GUI 应用程序?

测试

您可以测试脚本是否能够在没有会话相关环境变量的情况下运行,方法是在脚本调用前加上前缀env -i,例如

env -i /lib/systemd/system-sleep/start_my_lock

清空环境变量列表。

相关内容