AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1336570
Accepted
FalcoGer
FalcoGer
Asked: 2021-05-07 10:10:43 +0800 CST2021-05-07 10:10:43 +0800 CST 2021-05-07 10:10:43 +0800 CST

用于在 chroot 中运行守护进程的 SystemD 服务

  • 772

我已经设置了运行 ubuntu 20.04 服务器的树莓派,因此它可以使用 box86 运行 teampeak。

为此,我ls /srv/chroot/focal-armhf/使用 debootstrap 设置了一个 chroot。在那个目录中,我编译了 box86。然后我下载并安装了 ts3server for x86 on linux。我已经为 schroot 设置了自定义配置。

/etc/schroot/chroot.d/focal-armhf.conf:

[focal-armhf]
description=Ubuntu focal armhf chroot
type=directory
directory=/srv/chroot/focal-armhf
profile=ts3server
personality=linux
# preserve-environment=true
root-users=ubuntu
users=ubuntu

当我在主机上的 bash 中运行以下命令时,一切正常。

# beginn session, name it ts3server
sudo /usr/bin/schroot -n ts3server -b -c chroot:focal-armhf

# run start script. it's the same as the default start script, however I added /usr/local/bin/box86 in front of the starting of the actual server binary.
sudo /usr/bin/schroot --run-session --chroot ts3server -d /opt/ts3server/teamspeak3-server_linux_x86/ './ts3custom.sh' start

# at this point the server is running and i can connect to it.
# ...

# when I want to shut down:
# stopping server
/usr/bin/schroot --run-session --chroot ts3server -d /opt/ts3server/teamspeak3-server_linux_x86/ './ts3custom.sh' stop

# ending schroot session
/usr/bin/schroot -e --chroot ts3server

我现在想用 systemd 自动执行此操作。所以我创建了这个单元配置

[Unit]
Description=Teamspeak3 Server in chroot
After=network.target
After=syslog.target

[Service]
ExecStartPre=/usr/bin/schroot -n ts3server -b -c chroot:focal-armhf
ExecStart=/usr/bin/schroot --run-session --chroot ts3server -d /opt/ts3server/teamspeak3-server_linux_x86/ './ts3custom.sh' start
ExecStop=/usr/bin/schroot --run-session --chroot ts3server -d /opt/ts3server/teamspeak3-server_linux_x86/ './ts3custom.sh' stop
ExecStopPost=/usr/bin/schroot -e --chroot ts3server
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

当我运行它时,它会立即关闭。teampeak 服务器日志运行是

2021-05-06 17:58:49.429511|INFO    |ServerLibPriv |   |TeamSpeak 3 Server 3.13.3 (2020-12-16 14:17:05)
2021-05-06 17:58:49.456286|INFO    |ServerLibPriv |   |SystemInformation: Linux 5.4.0-1034-raspi #37-Ubuntu SMP PREEMPT Mon Apr 12 23:14:49 UTC 2021 i686 Binary: 32bit
2021-05-06 17:58:49.456975|WARNING |ServerLibPriv |   |The system locale is set to "C" this can cause unexpected behavior. We advice you to repair your locale!
2021-05-06 17:58:49.508403|INFO    |DatabaseQuery |   |dbPlugin name:    SQLite3 plugin, Version 3, (c)TeamSpeak Systems GmbH
2021-05-06 17:58:49.509804|INFO    |DatabaseQuery |   |dbPlugin version: 3.11.1
2021-05-06 17:58:49.553828|INFO    |DatabaseQuery |   |checking database integrity (may take a while)

如果我总是设置重启,它会一遍又一遍地生成相同的日志。
似乎服务器已启动,然后分叉到后台,然后由 systemd 调用 ExecStop。

我试过设置Type=forkingandType=exec和Type=simple,结果都一样。

基本上一切正常,直到我尝试使用 systemd 来管理它。

我怎样才能让它工作?

我特别想要:

  • 随系统自动启动
  • 管理它service ts3server start|stop|restart

为了完整起见,我的自定义脚本来管理 teampeak 服务器:

#!/bin/sh
# Copyright (c) 2019 TeamSpeak Systems GmbH
# All rights reserved

BINARYNAME="./ts3server"
COMMANDLINE_PARAMETERS="" #add any command line parameters you want to pass here
PID_FILE=ts3server.pid

do_start() {
        if [ -e $PID_FILE ]; then
                PID=$(cat "$PID_FILE")
                if (ps -p "$PID" >/dev/null 2>&1); then
                        echo "The server is already running, try restart or stop"
                        return 1
                else
                        echo "$PID_FILE found, but no server running. Possibly your previously started server crashed"
                        echo "Please view the logfile for details."
                        rm $PID_FILE
                fi
        fi
       if [ $(id -u) -eq 0 ]; then
               echo "WARNING ! For security reasons we advise: DO NOT RUN THE SERVER AS ROOT"
               c=1
               while [ "$c" -le 10 ]; do
                       echo -n "!"
                       sleep 1
                       c=$(($c + 1))
               done
               echo "!"
       fi
        echo "Starting the TeamSpeak 3 server"
        if [ ! -e "$BINARYNAME" ]; then
                echo "Could not find binary, aborting"
                return 5
        fi
        if [ ! -x "$BINARYNAME" ]; then
                echo "${BINARYNAME} is not executable, trying to set it"
                chmod u+x "${BINARYNAME}"
        fi
        if [ ! -x "$BINARYNAME" ]; then
                echo "${BINARNAME} is not exectuable, cannot start TeamSpeak 3 server"
                return 3
        fi
        /usr/local/bin/box86 "./${BINARYNAME}" "${@}" "daemon=1" "pid_file=$PID_FILE"
        if [ $? -eq 0 ]; then
                echo "TeamSpeak 3 server started, for details please view the log file"
        else
                echo "TeamSpeak 3 server could not start"
                return 4
        fi
}

do_stop() {
        if [ ! -e $PID_FILE ]; then
                echo "No server running ($PID_FILE is missing)"
                return 0
        fi
        PID=$(cat "$PID_FILE")
        if (! ps -p "$PID" >/dev/null 2>&1); then
                echo "No server running"
                return 0
        fi

        echo -n "Stopping the TeamSpeak 3 server "
        kill -TERM "$PID" || exit $?
        rm -f $PID_FILE
        c=300
        while [ "$c" -gt 0 ]; do
                if (kill -0 "$PID" 2>/dev/null); then
                        echo -n "."
                        sleep 1
                else
                        break
                fi
                c=$(($c - 1))
        done
        echo
        if [ $c -eq 0 ]; then
                echo "Server is not shutting down cleanly - killing"
                kill -KILL "$PID"
                return $?
        else
                echo "done"
        fi
        return 0
}

do_status() {
        if [ ! -e $PID_FILE ]; then
                echo "No server running ($PID_FILE is missing)"
                return 1
        fi
        PID=$(cat "$PID_FILE")
        if (! ps -p "$PID" >/dev/null 2>&1); then
                echo "Server seems to have died"
                return 1
        fi
        echo "Server is running"
        return 0
}

# change directory to the scripts location
cd $(dirname $([ -x "$(command -v realpath)" ] && realpath "$0" || readlink -f "$0"))

case "$1" in
start)
        shift
        do_start "$@" "$COMMANDLINE_PARAMETERS"
        exit $?
        ;;
stop)
        do_stop
        exit $?
        ;;
restart)
        shift
        do_stop && (do_start "$@" "$COMMANDLINE_PARAMETERS")
        exit $?
        ;;
status)
        do_status
        exit $?
        ;;
*)
        echo "Usage: ${0} {start|stop|restart|status}"
        exit 2
        ;;
esac
server
  • 1 1 个回答
  • 1343 Views

1 个回答

  • Voted
  1. Best Answer
    kanehekili
    2021-05-07T11:01:37+08:002021-05-07T11:01:37+08:00

    我在 tmux 上遇到过类似的问题,并像这样解决了它:

    [Install]
    WantedBy=multi-user.target
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    KillMode=none
    User=root
    ExecStart=...
    WorkingDirectory=
    

    自其父(服务)停止以来,服务似乎已结束。RemainAfterExit 和 KillMode 帮助...

    • 2

相关问题

  • 使用 dpkg 手动安装软件包是否会阻止未来的升级路径?

  • 如何从命令行刻录双层 dvd iso

  • 如果在服务器机器上运行 Ubuntu 桌面版,性能损失是多少?

  • 将桌面版剥离为服务器版的最简单方法是什么?

  • 如何与无头服务器进行图形交互?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve