teamspeak服务的启动自定义设置
设置服务自动启动脚本
sudo vim /lib/systemd/system/teamspeak.service
#这个 Systemd 服务单元文件中的代码可以实现 TeamSpeak 服务的自动启动是因为它定义了服务在系统引导过程中的行为,包括在什么时候启动以及如何启动。
#这个 Systemd 服务单元文件中的配置确保了在系统引导时,当满足特定的条件(网络和日志服务准备就绪)时,TeamSpeak 服务会自动启动。配置文件中定义了启动和停止服务的命令,并且指定了服务的依赖关系和工作环境,这些都是使服务能够在系统引导时自动启动的重要因素。
[Unit]
Description=Teamspeak, The most superior online voice communication solution.
Wants=network-online.target
After=syslog.target network.target network-online.target
[Service]
User=teamspeak
Group=teamspeak
WorkingDirectory=/home/teamspeak/teamspeak3-server_linux_amd64/
ExecStart=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh start
ExecStop=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh stop
PIDFile=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server.pid
Type=forking
[Install]
WantedBy=multi-user.target
[Unit]
部分:
Description=
:服务的简要描述。在这里描述为 “Teamspeak, The most superior online voice communication solution.”,是对服务的概括性描述。Wants=
:定义了服务单元依赖的其他单元。在这里,指定依赖network-online.target
,表示此服务需要在网络可用时启动。After=
:定义了服务单元应该在哪些单元之后启动。在这里,定义了在syslog.target
、network.target
和network-online.target
之后启动。
在 Systemd 中,
syslog.target
、network.target
和network-online.target
是特定的目标单元(Target Units),它们用于控制系统启动时的服务和目标。
- syslog.target:
syslog.target
是用于日志系统的目标单元。它表示系统启动后,日志服务需要准备就绪。当该目标单元被触发时,系统中的日志服务(如rsyslog
、syslog-ng
等)应该已经启动并准备好接收日志消息。
- network.target:
network.target
是用于网络的目标单元。当这个目标单元被触发时,表示系统的基本网络服务已经启动完成,并且网络连接已经可用。通常,一些基本的网络服务(如网络接口、DHCP 客户端等)会在此目标单元完成后启动。
- network-online.target:
network-online.target
是建立在network.target
之上的目标单元。与network.target
不同,network-online.target
表示系统的网络连接已经完全建立并处于可靠的在线状态。这个目标单元通常在network.target
启动后的一段时间内被触发,表示网络连接已经稳定。这些目标单元用于确定系统启动的阶段和确保在系统各个组件初始化完毕后再启动服务。在 Systemd 中,服务可以根据这些目标单元进行依赖和触发,以确保服务在所需的条件下启动。
[Service]
部分:
User=
:指定了运行服务的用户。在这里,服务将以teamspeak
用户的身份运行。Group=
:指定了服务运行的用户组。在这里,服务将以teamspeak
用户组的身份运行。WorkingDirectory=
:指定了服务的工作目录。在这里,设置工作目录为/home/teamspeak/teamspeak3-server_linux_amd64/
。ExecStart=
:指定了服务启动时执行的命令。在这里,指定了启动 TeamSpeak 服务器的脚本路径和命令。ExecStop=
:指定了服务停止时执行的命令。在这里,指定了停止 TeamSpeak 服务器的脚本路径和命令。PIDFile=
:指定了保存进程 ID 的文件路径。在这里,设置为/home/teamspeak/teamspeak3-server_linux_amd64/ts3server.pid
。Type=forking
:指定了服务的类型。forking
类型适用于会创建子进程并在父进程退出后继续运行的服务。
[Install]
部分:
WantedBy=multi-user.target
:指定了服务的安装信息。在这里,定义了当multi-user.target
启动时需要启动此服务。
这是一个 Systemd 服务单元文件的示例,用于启动和管理 TeamSpeak 3 服务器。这个文件描述了服务的名称、运行方式、用户和组、启动和停止命令以及其他配置。
具体到你提供的 Systemd 服务单元文件中:
[Unit]
部分描述了服务的基本信息,如描述、依赖关系等。Description
是对服务的简短描述。Wants
,After
确定了服务的依赖关系和启动顺序。[Service]
部分定义了服务运行的方式和相关的命令。User
和Group
指定了服务运行的用户和用户组。WorkingDirectory
设置了服务运行的工作目录。ExecStart
指定了服务启动时执行的命令。ExecStop
指定了服务停止时执行的命令。PIDFile
定义了存储进程 ID 的文件路径。Type
定义了服务的类型。
[Install]
部分定义了服务的安装信息,包括它如何在系统启动时自动启用。
这个示例文件主要用于管理 TeamSpeak 3 服务器,指定了如何启动和停止该服务。要使用这个文件,你可以将其保存在 /etc/systemd/system/
目录下(文件名通常以 .service
结尾),然后执行以下命令来启用并启动服务:
sudo systemctl daemon-reload # 重新加载 Systemd 配置
sudo systemctl enable your-service-name.service # 启用服务(使其在系统启动时自动启动)
sudo systemctl start your-service-name.service # 启动服务
sudo systemctl status your-service-name.service # 检查服务状态
请确保替换 your-service-name.service
为你所保存的服务文件的实际名称。
要停止服务,可以运行:
sudo systemctl stop your-service-name.service # 停止服务
设置固定时段
你需要创建两个 Systemd 定时器单元文件和两个 Systemd 服务单元文件,一个用于启动 TeamSpeak 3 服务器,另一个用于停止。
首先是创建定时器单元文件:
1. 启动定时器文件 teamspeak-start.timer
:
创建一个名为 teamspeak-start.timer
的文件,内容如下所示:
teamspeak-start.timer
文件内容:
[Unit]
Description=Start TeamSpeak Server at 19:00
[Timer]
OnCalendar=*-*-* 19:00:00
Persistent=true
[Install]
WantedBy=timers.target
2. 停止定时器文件 teamspeak-stop.timer
:
创建一个名为 teamspeak-stop.timer
的文件,内容如下所示:
teamspeak-stop.timer
文件内容:
[Unit]
Description=Stop TeamSpeak Server at 23:59
[Timer]
OnCalendar=*-*-* 23:59:00
Persistent=true
[Install]
WantedBy=timers.target
接下来,是创建服务单元文件:
3. 启动服务文件 teamspeak-start.service
:
创建一个名为 teamspeak-start.service
的文件,内容如下所示:
teamspeak-start.service
文件内容:
[Unit]
Description=Start TeamSpeak Server Service
Wants=network-online.target
After=syslog.target network.target network-online.target
[Service]
User=teamspeak
Group=teamspeak
WorkingDirectory=/home/teamspeak/teamspeak3-server_linux_amd64/
ExecStart=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh start
PIDFile=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server.pid
Type=forking
[Install]
WantedBy=multi-user.target
4. 停止服务文件 teamspeak-stop.service
:
创建一个名为 teamspeak-stop.service
的文件,内容如下所示:
teamspeak-stop.service
文件内容:
[Unit]
Description=Stop TeamSpeak Server Service
[Service]
User=teamspeak
Group=teamspeak
WorkingDirectory=/home/teamspeak/teamspeak3-server_linux_amd64/
ExecStop=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh stop
PIDFile=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server.pid
Type=forking
[Install]
WantedBy=multi-user.target
将这些文件分别保存在 /etc/systemd/system/
目录下,确保文件名以 .timer
或 .service
结尾。
接下来,启用和启动这些定时器和服务:
sudo systemctl daemon-reload # 重新加载 Systemd 配置
# 启用定时器 这个命令只是启用了定时器单元,但并没有开始执行定时器的操作。定时器的触发将遵循配置中指定的时间规则。
sudo systemctl enable teamspeak-start.timer
sudo systemctl enable teamspeak-stop.timer
# 启动定时器
sudo systemctl start teamspeak-start.timer
sudo systemctl start teamspeak-stop.timer
# 检查定时器状态
sudo systemctl status teamspeak-start.timer
sudo systemctl status teamspeak-stop.timer
● teamspeak-start.timer - Start TeamSpeak Server at 19:00
Loaded: loaded (/lib/systemd/system/teamspeak-start.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2023-11-17 14:43:52 CST; 12min ago
Trigger: Fri 2023-11-17 19:00:00 CST; 4h 3min left
Triggers: ● teamspeak-start.serviceNov 17 14:43:52 VM-4-14-ubuntu systemd[1]: Started teamspeak-start.timer.
teamspeak-start.timer
的说明:
teamspeak-start.timer
是一个 Systemd 定时器单元,负责在特定时间启动名为teamspeak-start.service
的服务。
- 当前状态和信息:
Loaded
:定时器单元已加载并处于已加载状态。Active
:定时器单元处于活动状态,状态为 “waiting”,表示正在等待触发。since
:显示了定时器单元最后一次状态变化的时间,即活动状态开始的时间。Trigger
:下一个定时器触发的时间。在这个例子中,下一个触发时间是Fri 2023-11-17 19:00:00 CST
,还有4
小时3
分钟才会触发。Triggers
:指示了定时器将触发的服务。在这里,它显示了teamspeak-start.service
,这是定时器将要启动的服务。根据输出信息显示,
teamspeak-start.timer
定时器已启用,并且在预定时间(Fri 2023-11-17 19:00:00 CST
)后将触发teamspeak-start.service
服务。目前定时器处于等待状态,等待触发时间的到来。
这样设置后,TeamSpeak 3 服务器将在每天的指定时间启动和停止。请确保修改文件中的路径和时间以适应你的系统和需求。
TS的启动脚本
ts3server_startscript.sh
#!/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
"./${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