Я настроил свой raspberry pi на сервере ubuntu 20.04, чтобы он мог запускать teampeak с помощью box86.
Для этого я установил chroot в ls / srv / chroot / focal-armhf /
с помощью debootstrap. В этом каталоге я скомпилировал box86. Затем я загрузил и установил ts3server для x86 на 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 = forking
и Type = exec
и Type = simple
, все с одинаковыми результатами.
В основном все работает нормально, пока я не попробую использовать systemd для управления всем этим.
Как я могу заставить его работать?
В частности, я хочу:
службы 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
У меня была похожая проблема с tmux и я решил ее так:
[Install]
WantedBy=multi-user.target
[Service]
Type=oneshot
RemainAfterExit=yes
KillMode=none
User=root
ExecStart=...
WorkingDirectory=
Похоже, что служба была завершена, так как ее родитель (служба) остановилась. RemainAfterExit и KillMode помогли...