我正在尝试让 systemd 服务在树莓派上启动时运行。它是一个 bash 脚本,用于检查 github 存储库并保持 python 脚本运行并保持最新。我已经尝试了服务文件的各种配置,注意到发生了一些网络错误,但我似乎无法运行它,因为 tmux 任务无法正常启动。
[Unit]
Description=Sensor API Service
Wants=network-online.target
After=network.target network-online.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/bash /home/pi/sensor/update.sh
[Install]
WantedBy=network-online.target
启动后 tmux 甚至无法正常运行,并出现以下错误:
error connecting to /tmp//tmux-100/default (No such file or directory)
这是我正在尝试运行的 bash 脚本。
#!/bin/bash
session="sensorInput"
workingDir="/home/pi/sensor"
if [ ! -d $workingDir ]; then
mkdir $workingDir
cd $workingDir
else
cd $workingDir
fi
function UOI () {
cd $workingDir
git clone {githublink}
shopt -s dotglob
mv -u sensor/* ./
rm -fr sensor
git reset --hard
git pull --force
git checkout .
pip3 install -r requirements.txt
}
function run () {
git fetch
if [ ! -f "app.py" ]; then
echo "Python app not found, running update/install function."
UOI
echo "Finished installing the script."
tmux new -d -s $session 'python3 app.py'
echo "Script is now running in session \'sensorInput\'"
elif git status --branch --porcelain -uno | grep behind; then
echo "Differences from main branch found, updating script."
echo "Terminating python script session."
tmux kill-session -t $session
UOI
echo "Finished updating the script."
tmux new -d -s $session 'python3 app.py'
echo "Script is now running in session \'sensorInput\'."
else
echo "No differences found, no action taken."
tmux has-session -t $session 2>/dev/null
if [ $? != 0 ]; then
echo "The script is not running, rebooting the script."
tmux new -d -s $session 'python3 app.py'
echo "Script is now running in session \'sensorInput\'."
fi
fi
}
while true; do run & sleep 60m; done
老实说,我已经没有想法了,我搜索了很多其他问题并尝试修改服务文件,但我似乎无法弄清楚。
如果我以某种方式错过了之前已经回答过的问题,我很抱歉。希望有人能帮助我。
启动后 tmux 甚至无法正常运行,并出现以下错误:
error connecting to /tmp//tmux-100/default (No such file or directory)
此错误表明当前没有 tmux 服务器正在运行。当您第一次创建新会话(通过
tmux new -s <session name>
)或使用 tmux start
显式启动它时,tmux 服务器会自动启动。我已经做了一些有限的测试,以验证您在服务文件中指定的目标在启动时是否属于这种情况(尽管对此有一些警告)。
除了一个 tmux 错误之外,您没有发布此服务的整个日志,但我相信此错误是由对
tmux kill-session ...
或 tmux has-session ...
的调用引发的,因为这些命令都不会启动 tmux 服务器并且(通过检查)肯定存在一些逻辑条件,您可以在服务启动时首先调用它们。由于您对 tmux has-session ...
的调用将 stderr 重定向到 /dev/null,因此您的错误一定来自 tmux kill
命令。
解决此问题的最简单方法是显式检查 tmux 是否正在运行,如果它不在脚本的最顶部,则启动它。我建议将以下内容添加到 bash 脚本的顶部(我推测是来自您的服务文件的 update.sh)。
if [[ ! tmux info &> /dev/null ]]; then
echo “Starting tmux server”
tmux start
fi
除了上述内容之外,您可能还需要考虑一些事情,以使这一切变得更加稳健。
network-online.target
是一个非常奇怪的目标。据我所知,这个目标通常会被推迟到启动结束时(如果它启动的话),因为它没有与正常启动服务相关的依赖项,因此使其依赖于您的服务是毫无意义的。更合理的目标类似于 multi-user.target
。
User=
和 Group=
如果将此服务文件放在systemd路径中,则默认情况下它将由root运行。还有一个用户服务目录,它将作为特定用户运行服务,但我相信这样做只会在该用户登录时运行。相反,我建议将
User=
和 Group=
选项添加到 [Service]
部分。这将使 systemd 以用户身份运行您的服务。在这种情况下我会推荐它,因为您只接触用户目录 (pi) 中的文件并且不需要 root 权限。
WorkingDir=home/pi/sensor
无需在脚本中设置字符串并对其调用
cd
,只需通过在 WorkingDir=
部分中设置 [Service]
来设置服务的工作目录即可。这将使您的服务在指定的目录中启动。不需要cd
。但请注意,如果目录不存在,设备将不会创建该目录。