You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 18.04下systemd调用bash脚本出现[: : integer expression expected]错误求助

解决systemd服务运行xprintidle脚本报错的问题

你遇到的核心问题是systemd服务默认没有X11会话的环境变量,而xprintidle是依赖X显示服务器的工具,在无桌面上下文的环境下无法正常工作。咱们一步步来解决:

错误原因分析

  1. couldn't open display:xprintidle需要知道当前X会话的DISPLAY和XAUTHORITY信息,而systemd的multi-user.target是无桌面的运行级别,默认不会提供这些变量。
  2. [: : 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:23:07