树莓派systemd服务开机启动时tmux任务运行失败如何解决
问题根因
该tmux报错由两个核心原因导致:
- systemd默认服务未指定运行用户,默认以root身份执行,且未加载普通用户的运行时环境变量,无法匹配pi用户(uid 100)的tmux运行时socket路径
/tmp/tmux-100目录为用户登录时由PAM模块自动生成的临时目录,开机启动阶段pi用户未登录时该目录不存在,tmux无法创建默认socket文件
修复方案
1. 调整systemd service配置
编辑你存放的.service文件(默认路径为/etc/systemd/system/下对应文件),替换为如下配置:
[Unit] Description=Sensor API Service Wants=network-online.target After=network.target network-online.target [Service] Type=simple # 指定以pi用户和用户组运行,匹配脚本目录权限 User=pi Group=pi # 配置用户运行时环境变量,指定tmux默认socket路径 Environment="XDG_RUNTIME_DIR=/run/user/100" # 启动前预创建tmux运行目录并设置正确权限 ExecStartPre=/usr/bin/mkdir -p /tmp/tmux-100 ExecStartPre=/usr/bin/chmod 700 /tmp/tmux-100 ExecStartPre=/usr/bin/chown pi:pi /tmp/tmux-100 Restart=always ExecStart=/usr/bin/bash /home/pi/sensor/update.sh [Install] WantedBy=multi-user.target
修改完成后执行以下命令使配置生效:
sudo systemctl daemon-reload sudo systemctl enable 你的服务文件名.service
如果修改后仍有路径报错,可执行id -u pi查询pi用户的真实uid,将上述配置中所有的100替换为查询到的数值即可。
2. 可选:优化bash脚本的tmux调用
为了彻底避免环境变量异常导致的调用失败,你可以将脚本中所有tmux命令手动指定socket路径,示例如下:
# 原tmux命令 tmux new -d -s $session 'python3 app.py' # 修改为指定socket路径 tmux -S /tmp/tmux-100/default new -d -s $session 'python3 app.py'
kill-session、has-session等所有tmux相关命令都做相同修改即可。
内容的提问来源于stack exchange,提问作者Aensland
相关产品推荐
相关产品推荐

