如何在启动时执行 shell 脚本?

如何在启动时执行 shell 脚本?

我已经创建了一个启动服务器的脚本(我的第一个问题)。现在我想让它在系统启动时运行并启动定义的服务器。我应该怎么做才能做到这一点?

我的发现告诉我将此文件放在该/etc/init.d位置,它将在系统启动时执行。但我不明白启动时的第一个参数是什么start?这是否预定义在某个地方以用作start$1如果我想要一个startall可以启动脚本中所有服务器的案例,那么我可以管理哪些选项?

我的脚本是这样的:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac

答案1

/etc/init.d是脚本目​​录,可执行脚本出现在其中。但是,为了在系统启动后按特定顺序运行脚本,您需要将文件添加到目录中/etc/rc#.d。此处出现的条目告诉您的系统应按什么顺序以及在哪个运行级别运行脚本/etc/init.d。根据此图表,rc 后面的数字表示机器在哪个运行级别运行:

http://en.wikipedia.org/wiki/Runlevel

因此如果你有:

/etc/init.d/importantscript

然后你需要(空)文件:

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

S 表示启动,K 表示终止。当您的机器启动时,系统会说“啊,我正在运行级别 3,让我们跳到 rc3.d 看看‘/etc/init.d’中需要运行哪些脚本以及按照什么顺序运行。”在这种情况下,系统将按“S”排序,然后按“S”后面的数字排序,并执行“/etc/init.d/importantscript start”。20 只是为了排序……您的脚本将在“S19”后面和“S21”前面运行。您只需执行以下操作即可创建这些文件:

sudo touch /etc/rc.d/rc3.d/S20importantscript

这也是一个很好的总结:http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts

答案2

你不必——也不应该——在中创建文件/etc/rc.d/rcN.d/;你应该做的是在初始化脚本中添加注释

# chkconfig NNN A B

其中NNN是您希望脚本在其中处于活动状态的运行级别集(例如,345如果它在运行级别 、 和 中处于活动状态345并且AB是启动和停止优先级。然后chkconfig --add foo(假设您的脚本名为)将使用适当的名称foo创建 中的文件。/etc/rc.d/rcN.d/

然后,您可以使用service foo barbar消息发送到您的脚本(例如start,,,stop无论什么 - 这就是您的来源$1)。

答案3

$1 是传递给脚本的命令行参数,它是 start、stop 或 restart 之一。在openSUSE,我不记得在使用运行级别编辑器时有将其他参数传递到脚本的选项,所以我认为这些可能是您唯一应该使用的。

我不使用CentOS我自己,但似乎控制在哪个运行级别启动的程序是系统变量

相关内容