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


13

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

我的发现告诉我,将此文件放在该/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

我知道这很旧...但是外壳应该是'#!/ bin / sh'而不是'#!/ bin / bash'/ bin / sh在机器在启动过程中出现问题的情况下更有可能工作(例如/ usr / lib无法挂载)
Rich Homolka

Answers:


19

/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


“ ln -s /etc/init.d/script”到rcX.d / *是否更常见?
ozma

8

您不必---也不应---在/etc/rc.d/rcN.d/;中创建文件;您应该做的是在您的init脚本阅读中添加注释

# chkconfig NNN A B

这里NNN是一组在您需要的脚本(例如,对运行级别的345,如果它是活跃在运行级别345),以及AB是启动和停止的优先级。然后chkconfig --add foo(假设您的脚本名为foo)将/etc/rc.d/rcN.d/使用适当的名称创建文件。

然后,您可以使用service foo bar到发送bar邮件到您的脚本(例如startstop不管是谁-这就是你的$1由来)。


0

$ 1是传递给脚本的命令行参数,它是启动,停止或重新启动之一。在openSUSE中,我不记得在使用运行级编辑器时有选择将其他参数传递到脚本的选项,因此,我认为这些可能是唯一应使用的参数。

我本人并没有使用CentOS,但似乎控制ntsysv在哪个运行级别启动的程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.