Linux 目录之 /etc/init.d/ 介绍

https://blog.csdn.net/qq_37212828/article/details/107227965

本目录下的所有文件

[root@EPC-M6G2C init.d]# ls
S01logging*          S30dbus*             S50telnet*           S90start_userapp.sh* 
S10udev*             S40network*          S70vsftpd*           socketcand*
S13portmap*          S50dropbear*         S80mount-opt*        rcK*
S20urandom*          S50sshd*             S81web.sh*           rcS*

先看一下rcS文件,它是本目录在开机时最先启动的文件

rcS文件

#!/bin/sh

# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do
     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue #如果是目录或设备文件则遍历下一个
     case "$i" in
        *.sh) #.sh结尾的脚本
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP  #重置陷阱为启动shell时的陷阱
                set start #设置传入的参数
                . $i #执行,携带start参数
            )
            ;;
        *) #其他脚本
            # No sh extension, so fork subprocess.
            $i start #执行,携带start参数
            ;;
    esac
done

总结:检测大写S开头的所有脚本并执行它们。

rcK文件是设备关机或重启执行的文件,它和rcS差不多,只有传入的参数有微微差别

rcK文件

#!/bin/sh

# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in $(ls -r /etc/init.d/S??*) ;do #$()相当于反引号,首先执行命令,-r倒序排列
     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue #如果不存在则遍历下一个
     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set stop
                . $i #执行,携带stop参数
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i stop #执行,携带stop参数
            ;;
    esac
done

总结:关机时还需要启动一遍启动脚本,只不过传入的参数是stop,需要处理一些后续工作才关机。

file:S01logging

#!/bin/sh
#
# Start logging
#

start() {
        echo -n "Starting logging: "
        start-stop-daemon -b -S -q -m -p /var/run/syslogd.pid --exec /sbin/syslogd -- -n
        start-stop-daemon -b -S -q -m -p /var/run/klogd.pid --exec /sbin/klogd -- -n
        echo "OK"
}

stop() {
        echo -n "Stopping logging: "
        start-stop-daemon -K -q -p /var/run/syslogd.pid
        start-stop-daemon -K -q -p /var/run/klogd.pid
        echo "OK"
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $? #最后一次命令的执行状态码,0为正常。

由rcS或者rcK脚本调用的子进程运行此脚本,传递start或stop参数来控制执行start函数或stop函数。
start-stop-daemon守护进程启停工具命令
参数
-b | --background 后台运行
-S | --start – 开启一个系统守护程序,并传递参数给它
-K | --stop 停止一个程序
-q | --quiet 不要输出警告
-m| --make-pidfile 当命令本身不创建pidfile时,由start-stop-daemon创建
-p | --pidfile 要检查的pid文件
-x | --exec 程序启动/检查它是否正在运行
-n | --name 要检查的进程名称

file:S10udev

#!/bin/sh
#
# udev  This is a minimal non-LSB version of a UDEV startup script.  It
#       was derived by stripping down the udev-058 LSB version for use
#       with buildroot on embedded hardware using Linux 2.6.34+ kernels.
#
#       You may need to customize this for your system's resource limits
#       (including startup time!) and administration.  For example, if
#       your early userspace has a custom initramfs or initrd you might
#       need /dev much earlier; or without hotpluggable busses (like USB,
#       PCMCIA, MMC/SD, and so on) your /dev might be static after boot.
#
#       This script assumes your system boots right into the eventual root
#       filesystem, and that init runs this udev script before any programs
#       needing more device nodes than the bare-bones set -- /dev/console,
#       /dev/zero, /dev/null -- that's needed to boot and run this script.
#

# Check for missing binaries
UDEV_BIN=/sbin/udevd
test -x $UDEV_BIN || exit 5 #文件不可执行则退出,退出码:5

# Check for config file and read it
UDEV_CONFIG=/etc/udev/udev.conf
test -r $UDEV_CONFIG || exit 6 #文件不可读则退出,退出码:6
. $UDEV_CONFIG

case "$1" in
    start) #设备开机时
        printf "Populating ${udev_root:-/dev} using udev: "
        printf '\000\000\000\000' > /proc/sys/kernel/hotplug
        $UDEV_BIN -d || (echo "FAIL" && exit 1) #执行失败打印“FAIL”并退出
        udevadm trigger --type=subsystems --action=add
        udevadm trigger --type=devices --action=add
        udevadm settle --timeout=30 || echo "udevadm settle failed"
        echo "done"
        ;;
    stop) #设备关机或重启
        # Stop execution of events
        udevadm control --stop-exec-queue
        killall udevd
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit 0

udevadm trigger [options]  接收内核发送来的设备事件。主要用于重放coldplug事件信息
–type=type         触发一个特殊的设备。合法的类型:devices,subsystem,failed.默认是devices
–action=action      被触发的事件,默认是change

udevadm settle [options]  查看udev事件队列,如果所有事件全部处理完就退出。
–timeout=seconds     等待事件队列空的最大时间。默认是180秒。如果是0则立即退出。

udevadm control [options]   控制udev守护进程(systemd-udevd)的内部状态。
-s, --stop-exec-queue    向 systemd-udevd 发送"禁止处理事件"信号, 这样所有新发生的事件都将进入等候队列。

file:S13portmap

#! /bin/sh

[ -f /sbin/portmap ] || exit 0 #不存在此文件就退出

start() {
        echo -n "Starting portmap: "
        portmap
        mkdir -p /var/lock/subsys
        touch /var/lock/subsys/portmap #锁定此服务
        echo "done"
}

stop() {
        echo -n "Stopping portmap: "
        echo
        killall portmap
        rm -rf /var/lock/subsys
        echo "done"
}

restart() {
        stop
        start
        rm -f /var/run/portmap.state
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        restart
        ;;
  *)
        echo "Usage: $0 {start|stop|reload|restart}"
        exit 1
esac

exit $? 

file:S20urandom

#! /bin/sh
#
# urandom       This script saves the random seed between reboots.
#               It is called from the boot, halt and reboot scripts.
#
# Version:      @(#)urandom  1.33  22-Jun-1998  miquels@cistron.nl
#

[ -c /dev/urandom ] || exit 0  #不存在字符设备urandom就退出
#. /etc/default/rcS

case "$1" in
        start|"")
                # check for read only file system
                if ! touch /etc/random-seed 2>/dev/null #如果无法创建random-seed文件
                then
                        echo "read-only file system detected...done" #检测到只读文件系统
                        exit #退出
                fi
                if [ "$VERBOSE" != no ]
                then
                        echo -n "Initializing random number generator... "
                fi
                # Load and then save 512 bytes,
                # which is the size of the entropy pool
                cat /etc/random-seed >/dev/urandom
                rm -f /etc/random-seed
                umask 077  #配置文件夹默认权限
                dd if=/dev/urandom of=/etc/random-seed count=1 \
                        >/dev/null 2>&1 || echo "urandom start: failed."
                umask 022
                [ "$VERBOSE" != no ] && echo "done."
                ;;
        stop)
                if ! touch /etc/random-seed 2>/dev/null
                then
                        exit
                fi
                # Carry a random seed from shut-down to start-up;
                # see documentation in linux/drivers/char/random.c
                [ "$VERBOSE" != no ] && echo -n "Saving random seed... "
                umask 077
                dd if=/dev/urandom of=/etc/random-seed count=1 \
                        >/dev/null 2>&1 || echo "urandom stop: failed."
                [ "$VERBOSE" != no ] && echo "done."
                ;;
        *)
                echo "Usage: urandom {start|stop}" >&2
                exit 1
                ;;
esac

你可能感兴趣的:(linux,init.d)