命令“xprintidle”在 systemd 服务中返回非零退出状态 1

命令“xprintidle”在 systemd 服务中返回非零退出状态 1

我有一个带有 Raspbian Buster Lite 的 Raspberry Pi,我以自动登录的 KIOSK 模式启动。目的是在连接的 7" 触摸屏(带有 Chromium)上显示单个网页。如果系统空闲,我的 python 脚本应该检测到它并自动调暗屏幕。当用户再次与屏幕交互时,它应该亮起向上。

这是我的脚本 ( dim_screen.py):

#!/usr/bin/env python3
导入子流程
导入时间
导入系统

从 rpi_backlight 导入背光

背光=背光()

# 从运行命令中读取参数:
# 变暗前的空闲时间(以秒为单位)
idleTimeBeforeDimMS = int( sys.argv[1] )*1000

# 变暗时的亮度(0 到 100 之间)
亮度变暗 = int( sys.argv[2] )
亮度全= 100

def get(cmd):
    # 只是一个辅助函数
    返回 subprocess.check_output(cmd).decode("utf-8").strip()

空闲0 = 假
状态改变=假
观察变化时间间隔S = 100 / 1000

而真实:
    time.sleep( timeIntervalToWatchChangesS )

    currentIdleTimeMS = int( get("xprintidle") )

    isIdle = currentIdleTimeMS >idleTimeBeforeDimMS
    stateChanged = isIdle0 != isIdle

    如果 isIdle 和 stateChanged:
        # 空转
        背光.亮度 = 亮度调暗
    elif 不是 isIdle 和 stateChanged:
        # 积极的
        背光.亮度 = 亮度Full

    # 将当前状态设置为下一个循环的初始状态
    空闲0 = 空闲

当我从 SSH 启动时,我的脚本按预期工作(我可以通过在 Windows 10 计算机上从 Putty 连接到我的 Pi 来测试它): pi@raspberrypi:~$ /usr/bin/python3 /home/pi/startup_scripts/dim_screen.py 10 25

systemctl start dim_screen.service不幸的是,当我尝试从 systemd (或通过)启动时将脚本作为服务运行时,情况并非如此。我无法让它工作。

这是我的 dim_screen.service 文件:

[单元]
描述=确保 7" 树莓派屏幕在用户不与其交互 25 分钟后自动调暗至 10% 亮度
After=多用户.target

[服务]
ExecStart=/usr/bin/python3 /home/pi/startup_scripts/dim_screen.py 10 25

[安装]
WantedBy=多用户.target

如果我重新启动并运行sudo systemctl status dim_screen.service,我会得到以下信息:

端子输出故障

我相信最重要的调试信息是这一行:Command 'xprintidle' returned non-zero exit status 1.

我觉得这很奇怪吗?如果我xprintidle在终端中运行,会发生以下情况:

pi@raspberrypi:~$ xprintidle
11399922

换句话说,我得到了有效的回复xprintidle。我相信还有什么我不明白的地方?

dim_screen.py将 python 脚本 ( ) 作为服务启动的正确方法是什么?

答案1

这篇文章没有回答原来的问题。这是一个解决方法

由于我无法理解 xprintidle-returned-non-zero-exit-status-1 的原因,我被迫尝试一种解决方法。

当我将 Pi 设置为在 kiosk 模式下运行 chromium 时,我遵循了有关如何完成此操作的教程:RASPBERRY PI 触摸屏信息亭设置 10 个步骤。在本教程中,我被指示配置 Openbox 窗口管理器。在 Chromium 浏览器启动之前,我能够将 pythonscript 作为分叉进程调用。这个“解决方案”可能违反了最佳实践的所有可能规则,但它解决了我的问题。至少在我能找到更好的方法之前是这样。

这是我的/etc/xdg/openbox/autostart

#
# 这些东西在 Openbox X 会话启动时运行。
# 您可以在 $HOME/.config/openbox/autostart 中放置类似的脚本
# 运行特定于用户的事情。
#

# 如果你想使用 GNOME 配置工具...
#
#if test -x /usr/lib/arm-linux-gnueabihf/gnome-settings-daemon >/dev/null;然后
# /usr/lib/arm-linux-gnueabihf/gnome-settings-daemon &
#elif which gnome-settings-daemon >/dev/null 2>&1;然后
# gnome 设置守护进程 &
#fi

# 如果你想使用 XFCE 配置工具...
#
#xfce-mcs-经理 &

# 首先,添加关闭电源管理、屏幕消隐和屏幕保存的命令。我们不希望信息亭具有这些功能。
xset -dpms #关闭显示电源管理系统
xset s noblank # 关闭屏幕消隐
xset s off #关闭屏幕保护

# 接下来,如果 Chromium 崩溃,下次启动时可能会弹出错误消息。这是我们在信息亭中不想要的另一个功能。
# 从配置文件中删除可能触发警告的退出错误

sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' ~/.config/chromium/'本地状态'
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/; s/"exit_type":"[^"]\+"/"exit_type":"正常"/' ~/.config/chromium/Default/Preferences

# 调用当用户空闲时使(唯一)屏幕变暗的脚本
/usr/bin/python3 /home/pi/startup_scripts/dim_screen.py 10 25 &

# 最后,更新自动启动以在 kiosk 模式下运行 Chromium 浏览器。传入一个环境变量 ($KIOSK_URL),其中包含要启动的 Web 应用程序的 URL。
# 在 kiosk 模式下运行 Chromium
chromium-browser --noerrdialogs --disable-infobars --kiosk --check-for-update-interval=31536000 $KIOSK_URL

相关内容