如何使用 tmux 让 systemd 服务在启动时运行

问题描述 投票:0回答:1

我正在尝试让 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

老实说,我已经没有想法了,我搜索了很多其他问题并尝试修改服务文件,但我似乎无法弄清楚。

如果我以某种方式错过了之前已经回答过的问题,我很抱歉。希望有人能帮助我。

bash service systemd tmux reboot
1个回答
0
投票

启动后 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

一些补充意见

除了上述内容之外,您可能还需要考虑一些事情,以使这一切变得更加稳健。

1.我建议设置一个不同的“WantedBy”目标

network-online.target
是一个非常奇怪的目标。据我所知,这个目标通常会被推迟到启动结束时(如果它启动的话),因为它没有与正常启动服务相关的依赖项,因此使其依赖于您的服务是毫无意义的。更合理的目标类似于
multi-user.target

2.考虑设置
User=
Group=

如果将此服务文件放在systemd路径中,则默认情况下它将由root运行。还有一个用户服务目录,它将作为特定用户运行服务,但我相信这样做只会在该用户登录时运行。相反,我建议将

User=
Group=
选项添加到
[Service]
部分。这将使 systemd 以用户身份运行您的服务。在这种情况下我会推荐它,因为您只接触用户目录 (pi) 中的文件并且不需要 root 权限。

3.考虑设置
WorkingDir=home/pi/sensor

无需在脚本中设置字符串并对其调用

cd
,只需通过在
WorkingDir=
部分中设置
[Service]
来设置服务的工作目录即可。这将使您的服务在指定的目录中启动。不需要
cd
。但请注意,如果目录不存在,设备将不会创建该目录。

© www.soinside.com 2019 - 2024. All rights reserved.