Ubuntu 18.04下systemd调用bash脚本出现[: : integer expression expected]错误求助
解决systemd服务运行xprintidle脚本报错的问题
你遇到的核心问题是systemd服务默认没有X11会话的环境变量,而xprintidle是依赖X显示服务器的工具,在无桌面上下文的环境下无法正常工作。咱们一步步来解决:
错误原因分析
couldn't open display:xprintidle需要知道当前X会话的DISPLAY和XAUTHORITY信息,而systemd的multi-user.target是无桌面的运行级别,默认不会提供这些变量。[: : integer expression expected:因为xprintidle执行失败,myidle变量为空,导致后续的整数比较操作出错。
解决方案
1. 修改systemd服务文件,添加用户和环境变量
编辑你的/etc/systemd/system/poweroff.service,让服务以当前登录用户的身份运行,并注入必要的X环境变量:
[Unit] Description=autopoweroff # 确保服务在桌面环境启动后再运行 After=graphical.target [Service] # 替换成你的实际用户名(可以用`whoami`命令查看) User=godo # 设置X显示端口,桌面会话通常是:0 Environment="DISPLAY=:0" # 指定X授权文件路径,一般在用户主目录下 Environment="XAUTHORITY=/home/godo/.Xauthority" ExecStart=/bin/bash /usr/local/bin/poweroff.sh [Install] # 改为依赖graphical.target,而非multi-user.target WantedBy=graphical.target
2. 验证环境变量的正确性(可选)
如果还是有问题,可以先在终端里执行以下命令,确认你的X环境变量值:
echo $DISPLAY echo $XAUTHORITY
把输出的结果替换到服务文件的Environment字段中,确保完全匹配。
3. 优化脚本,增加错误处理
为了避免空变量导致的脚本崩溃,可以在脚本里添加判断逻辑:
#!/bin/bash sleep 2 # 捕获xprintidle的错误输出,避免污染变量 myidle=$(xprintidle 2>/dev/null) # 如果获取空闲时间失败,直接退出 if [ -z "$myidle" ]; then echo "Error: Could not get idle time (no display access)" exit 1 fi myidletime=$((10000)) while [ "$myidle" -le "$myidletime" ]; do echo $myidle sleep 1 myidle=$(xprintidle 2>/dev/null) # 再次检查是否获取成功 if [ -z "$myidle" ]; then echo "Lost display connection, exiting." exit 1 fi done # sudo shutdown -P now # shutdown -P 5 echo "end"
4. 重新加载并重启服务
修改完成后,执行以下命令让systemd生效:
sudo systemctl daemon-reload sudo systemctl enable poweroff.service sudo systemctl restart poweroff.service
然后用systemctl status poweroff.service查看服务状态,应该就不会再出现之前的错误了。
内容的提问来源于stack exchange,提问作者user11858379
相关产品推荐
相关产品推荐

