我有一个带有 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