如何使 /etc/init.d 中的脚本在启动时启动?

如何使 /etc/init.d 中的脚本在启动时启动?

我想我不久前读过一些关于此的内容,但我不记得它是如何完成的。本质上,我有一项服务/etc/init.d希望在启动时自动启动。我记得它与将脚本符号链接到目录有关/etc/rc.d,但我现在不记得了。这个命令是什么?

我相信我使用的是 Fedora/CentOS 衍生产品。

答案1

如果您使用的是基于 Red Hat 的系统,正如您所提到的,您可以执行以下操作:

  1. 创建一个脚本并将其放入/etc/init.d(例如/etc/init.d/myscript)中。该脚本应具有以下格式:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

格式非常标准,您可以在/etc/init.d.然后您可以像这样使用脚本/etc/init.d/myscript startchkconfig myscript start.手册ckconfig页解释了脚本的标题:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

示例启动、停止和状态代码使用中定义的辅助函数/etc/init.d/functions

  1. 启用脚本

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. 检查脚本确实已启用 - 您应该看到您选择的级别“打开”。

    $ chkconfig --list | grep myscript
    

答案2

您测试您的机器通常启动到什么运行级别。

runlevel

通常这是 5 或 2 - 有各种约定,但没有什么真正确定的,据我所知。 Ubuntu 使用 2,而我以前使用的发行版总是使用

  • 1 个单用户(超级用户)
  • 2 多用户
  • 3.多用户+网络
  • 4 未使用/用户可定​​义
  • 5个多用户,网络+X11

然后你从你的初始化脚本中创建一个符号链接,也许是/etc/init.d/foobar为了/etc/rc2.d/SXYfoobar

S 表示“在此运行级别启动此脚本(此处:2)”。 XY 是两位十进制数,与脚本启动的顺序相关。

如果您依赖于在您之前运行的脚本 S45barfoo,并且 S55foofoo 依赖于您的脚本,则您可以选择 45 到 55 之间的 xy。对于相同的数字,启动顺序未定义。

与此同时,Ubuntu 切换(正在切换)到另一个启动程序,称为upstart.

并注意:并不总是链接到/etc/rcX.d- 有时它是/etc/init/rcX.d或类似的东西,但它应该很容易找到,位于/etc下面的某个地方。

如果您想在启动脚本末尾启动某些内容,/etc/rc.local则需要查找文件,但如果它依赖于已运行的 X11,您可能会查找桌面环境的自动启动选项,或者/etc/X11/Xsession.d/使用与所述类似的模式多于。

如果您依赖于网络正常运行,则有一个单独的目录 (if-up.d),用于存放已安装的设备(例如外部 USB 驱动器)/etc/udev/rules.d/

答案3

在这个答案中,假设我想通过 Ubuntu 系统上的服务脚本挂载在/etc/fstabvia中定义的 Windows 共享 (CIFS)。mount -a -t cifs首先,我在下面创建一个/etc/init.d/mountcifs包含内容的条目:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          mountcifs
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Mounts / Umounts Window Shares (CIFS)
# Description: Mounts / Umounts Window Shares (CIFS)
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

case "$1" in
  start)
        mount -a -t cifs
        ;;
  stop)
        umount -a -t cifs
        ;;
  restart|reload|force-reload)
        umount -a -t cifs
        mount -a -t cifs
        ;;
  *)
        # echo "Usage: $0 start|stop" >&2
        # exit 3
        ;;
esac

确保/etc/init.d/mountcifs可以使用chmod 755 /etc/init.d/mountcifs.

请注意# Default-Start: 2 3 4 5评论中的。由于这个注释,我们可以使用以下命令让 Ubuntu 在/etc/rc2.d/etc/rc3.d和文件/etc/rc4.d夹中创建符号链接:/etcrc5.d

sudo update-rc.d mountcifs defaults

然后我们可以测试脚本如下:

sudo service start mountcifs
df -h # should see Windows Shares
sudo service stop mountcifs
df -h # all Windows Shares should be gone
sudo service start mountcifs
df -h # all Windows Shares should be back

Windows 共享应该在重新启动时自动安装。

答案4

正如 Naftuli Tzvi Kay 上面询问的有关 Debian 的问题:从 Debian 6 开始,您的脚本应包含一个 LSB(Linux 标准库)标头,指示其依赖性和功能(请参阅 Debian 维基页面)。

如果存在 LSB 标头,您可以使用insserv将脚本包含在引导过程中(查看另一个 Debian 维基页面)。

相关内容