在启动时启动自定义屏幕保护程序的行为与手动启动屏幕保护程序不同

Starting a custom screensaver on boot behaves differently than manually starting the screensaver

我有一个触摸屏亭,我在上面 运行 一个网络服务器。如果屏幕在一定时间内没有被触摸,我想放映幻灯片。为此,我有下面的脚本。

#!/bin/sh

# Wanted trigger timeout in milliseconds.
IDLE_TIME=$((15*1000))

# Sequence to execute when timeout triggers.
trigger_cmd() {
DISPLAY=:0 feh -ZXYrzFD 10 /home/pi/screensaver/img --zoom fill &
    echo '"pkill -n feh; pkill -n xbindkeys"'>/home/pi/screensaver/xbindkeys.temp
    echo "b:1">>/home/pi/screensaver/xbindkeys.temp
    DISPLAY=:0 xbindkeys -n -f /home/pi/screensaver/xbindkeys.temp
    sudo rm /home/pi/screensaver/xbindkeys.temp
}

sleep_time=$IDLE_TIME
triggered=false

# ceil() instead of floor()
while sleep $(((sleep_time+999)/1000)); do
    idle=$(DISPLAY=:0 xprintidle)
    if [ $idle -gt $IDLE_TIME ]; then
        if ! $triggered; then
            trigger_cmd
            triggered=true
            sleep_time=$IDLE_TIME
        fi
    else
        triggered=false
        # Give 100 ms buffer to avoid frantic loops shortly before triggers.
        sleep_time=$((IDLE_TIME-idle+100))
    fi
done

我使用 xprintidle 来检查屏幕空闲了多长时间。 xbindkeys 部分用于在触摸屏幕时杀死 feh。当我手动启动脚本时,我可以通过触摸一次屏幕来关闭幻灯片,它会在给定的空闲时间后重新打开。当我通过 init.d 中的脚本启动脚本时,我必须触摸屏幕两次才能再次打开幻灯片,如果只触摸屏幕一次,则永远不会重新打开幻灯片。
init.d 中的脚本只是作为用户 pi 启动上面的脚本。

谁能帮我弄清楚为什么在启动时启动脚本显然会导致脚本需要单击两次而不是单击一次来启动空闲计时器?

触摸屏脚本很可能在 DISPLAY 设置环境变量(即用户 pi 未登录)之前被 init.d 运行。

.bash_profile 尝试 运行 宁此。这样你的所有用户环境变量都将被设置,特别是 $DISPLAY 并且脚本将在登录后 运行 一次。