我使用 screen 在专用服务器上托管了一些《反恐精英》游戏服务器。当我想启动/停止服务器时,我会运行这个脚本:
#! /bin/sh
# /etc/init.d/css-server
#
case "$1" in
start)
echo "Starting Nullus Imprimis war server..."
screen -A -m -d -S css-war-server /home/css-servers/war-server/css/srcds_run -game cstrike +map de_dust2 +maxplayers 16 -autoupdate -port 2555 -tick 100
echo "Nullus Imprimis war server started"
echo "Starting Nullus Imprimis pub server #1..."
screen -A -m -d -S css-pub-server-1 /home/css-servers/pub-server-1/css/srcds_run -game cstrike +map de_dust2 +maxplayers 32 -autoupdate -port 2666 -tickrate 100
echo "Nullus Imprimis pub server #1 started"
;;
stop)
echo "Stopping Nullus Imprimis war server..."
screen -S css-war-server -X quit
echo "Nullus Imprimis war server stopped"
echo "Stopping Nullus Imprimis pub server #1..."
screen -S css-pub-server-1 -X quit
echo "Nullus Imprimis pub server #1 stopped"
;;
*)
echo "Usage: /etc/init.d/css-servers {start|stop}"
exit 1
;;
esac
exit 0
我把这个脚本(称为css-servers
)放入/etc/init.d/
,据我所知,这意味着它在系统启动时运行。但是当我使用检查活动屏幕时,screen -ls
没有正在运行的屏幕。
我如何才能让这些在 Ubuntu Server 下启动时运行?
答案1
仅仅有脚本/etc/init.d
并不足以使其在启动时运行。
要将其添加到您的启动中,您必须告诉 Ubuntu:
sudo update-rc.d css-servers defaults
如果脚本格式正确、可执行位设置等,它应该在下次启动时启动。您从apt-get
/Software Center 安装的软件包会自动运行此命令或其等效命令,这就是为什么您通常不必担心它。
如果想立即启动,直接调用即可:
sudo service css-servers start
答案2
您已完成第一部分。 /etc/init.d
是运行初始化脚本的地方。但是,它们不会自动运行。
它们按照符号链接指定的顺序运行目录/etc/rc*.d
。每个运行级别都有自己的目录。链接名称以 开头的K
脚本使用停止参数运行,而链接名称以 开头的脚本S
使用启动参数运行。按照惯例,文件名以 开头K
或S
后跟用于排序的两位数字,并以 中的脚本名称结尾/etc/init.d
。
链接可以手动创建,但通常使用脚本创建。Ubuntuupdate-rc.d
上提供通用脚本。该命令man update-rc.d
将为您提供有关谁使用它的文档。对于您的情况,请尝试:
sudo update-rc.d css-servers defaults
要使用 init 脚本启动它,请尝试:
sudo /etc/init.d/css-servers start
我通常以这种方式启动和停止服务器,以确保脚本按预期工作。然后我运行update-rc.d
以将其添加到/etc/rc.d
运行级别目录。
答案3
如果您不知道为什么您的服务没有在启动时启动。但是,当您尝试手动启动服务时,它可以正常工作service <your service> start
。在这种情况下,请尝试将标准输出和错误输出重定向到某个文件。这可能会让您知道为什么它在启动系统时没有启动。
例如在你的脚本中
case "$1" in
start)
echo "Starting Service "
<your command to start the service > /tmp/bootservice.log 2>&1
;;
stop)
echo "Stopping Service "
<your command to start the service > /tmp/bootservice.log 2>&1
;;
*)
echo "Usage: /etc/init.d/test {start|stop}"
exit 1
;;
esac
exit 0
答案4
此外,对于那些陷入困境的人来说:shebang 对于 init.d 脚本是必需的。
#!/bin/sh