init.d 脚本在启动时未运行

init.d 脚本在启动时未运行

我使用 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使用启动参数运行。按照惯例,文件名以 开头KS后跟用于排序的两位数字,并以 中的脚本名称结尾/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

相关内容