工控机使用SysVinit 启动脚本


SysVinit 启动脚本详细介绍


1. 什么是 SysVinit?

  • SysVinit 是传统的 Linux 初始化系统(init system),负责系统启动时初始化各种服务和进程。
  • 它通过 /etc/inittab 文件控制启动流程,执行一系列启动脚本完成系统初始化。
  • 主要用于 Linux 早期发行版,现在很多系统改用 systemd,但很多裁剪版或嵌入式系统仍用 SysVinit。

2. SysVinit 的启动脚本体系

  • 启动脚本一般放在 /etc/init.d/ 目录,每个脚本负责启动、停止某个服务。

  • 启动脚本通过符号链接放在 /etc/rcX.d/ 目录(X是运行级别,0~6),决定该服务在哪些运行级别自动启动或停止。

  • 启动脚本命名规则:

    • SNNname:启动脚本(S 开头,NN 是启动顺序数字,数字越小越先启动)
    • KNNname:停止脚本(K 开头,NN 是停止顺序数字,数字越小越先停止)

3. 运行级别(Runlevels)

  • Linux 定义了多个运行级别(runlevel),常见的有:

    • 0:关机(halt)
    • 1:单用户模式(维护模式)
    • 2~5:多用户模式(具体定义依发行版而异)
    • 6:重启
  • 通过运行级别切换,系统启动或关闭不同的服务。


4. 启动流程简述

  1. 系统启动后,init 进程读取 /etc/inittab,确定默认运行级别。
  2. 执行对应运行级别的启动脚本,比如 /etc/rc3.d/
  3. 按顺序执行启动目录里的 S* 脚本,启动服务。
  4. 系统关闭时,执行相应的 K* 脚本停止服务。

5. 启动脚本的编写规范

5.1 脚本的位置

  • 放在 /etc/init.d/,文件名一般对应服务名。

5.2 必须实现的参数

启动脚本一般接收以下参数:

  • start:启动服务
  • stop:停止服务
  • restart:重启服务(先停止再启动)
  • status(可选):查看服务状态

5.3 脚本结构示例

#!/bin/sh
# 服务名:示例服务

case "$1" in
  start)
    echo "Starting service..."
    # 启动命令
    ;;
  stop)
    echo "Stopping service..."
    # 停止命令
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  status)
    # 检查服务状态的命令
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

5.4 启动脚本应具备的功能

  • 启动服务,通常用 nohup 或后台启动命令,重定向日志。
  • 停止服务,通常用 killpkill 关闭进程。
  • 重启服务,先停止再启动。
  • 状态检查,查看服务是否运行(可选)。

6. 脚本权限和注册

  • 脚本必须可执行:
chmod +x /etc/init.d/your_service
  • 注册到运行级别启动(Debian/Ubuntu 系统):
update-rc.d your_service defaults
  • 在 CentOS/RHEL 上:
chkconfig --add your_service

这会自动创建 /etc/rcX.d/ 目录下的 S*K* 软链接。


7. 例子:典型 SysVinit 脚本(简化版)

#!/bin/sh
# /etc/init.d/myapp

case "$1" in
  start)
    echo "Starting myapp..."
    cd /opt/myapp
    nohup ./myapp_binary > /var/log/myapp.log 2>&1 &
    ;;
  stop)
    echo "Stopping myapp..."
    pkill -f myapp_binary
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  status)
    pgrep -f myapp_binary >/dev/null && echo "myapp is running" || echo "myapp is stopped"
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac
exit 0

8. 现代系统为什么多用 systemd?

  • systemd 提供更强的依赖管理、并行启动、状态监控和日志管理。
  • 但裁剪版、嵌入式系统仍多用 SysVinit,因其简单、体积小。

9. 总结

方面 说明
位置 /etc/init.d/
启动脚本格式 接收 startstoprestartstatus 参数
运行级别管理 /etc/rcX.d/ 下通过 SNNnameKNNname 软链接控制启动和停止顺序
启动机制 /etc/inittab 通过运行级别调用对应脚本
脚本功能 启动服务进程、停止服务进程、支持重启和状态查看

posted @ 2025-07-31 10:59  daviyoung  阅读(28)  评论(0)    收藏  举报