温馨提示×

linux进程启动顺序怎样

小樊
35
2026-09-18 15:31:48
栏目: 智能运维

在 Linux 中,“进程启动顺序”可以从系统启动角度进程创建角度两个层面来理解。下面分别说明。


一、系统启动时的进程启动顺序(从开机到用户空间)

以常见的 Linux + systemd 系统为例(嵌入式或 SysVinit 略有不同):

1. 硬件与引导阶段

  1. BIOS / UEFI
    • 加电自检(POST)
    • 加载 bootloader(GRUB 等)
  2. Bootloader
    • 加载内核 vmlinuz 和 initramfs

2. 内核启动

  1. Linux 内核启动
    • 初始化 CPU、内存、设备驱动
    • 挂载根文件系统
  2. 启动第一个用户态进程
    • 内核启动 /sbin/init(或 systemd)

3. 用户空间初始化(systemd)

  1. PID 1:systemd
    • 是所有用户进程的“祖先”
  2. systemd 按 unit 依赖关系启动
    • local-fs.target(挂载文件系统)
    • swap.target
    • sysinit.target
    • basic.target
    • multi-user.target(命令行)
    • graphical.target(图形界面)
  3. 启动各类服务(daemon)
    • 网络、SSH、日志、数据库等
  4. 启动登录管理
    • getty / login / gdm

简化顺序

BIOS/UEFI
  → Bootloader
    → Linux Kernel
      → /sbin/init (systemd, PID 1)
        → targets & services
          → login / shell

二、单个进程的创建顺序(fork / exec)

当一个“新进程”被启动时:

1. 父进程调用 fork()

  • 复制父进程地址空间
  • 子进程获得新的 PID

2. 子进程调用 exec()

  • 替换进程映像(加载新程序)
  • 开始执行新程序 main()

3. 内核调度执行

  • 进程进入就绪队列
  • 被 CPU 调度运行

示例

pid_t pid = fork();
if (pid == 0) {
    execvp("ls", args);
}

三、进程启动的“顺序控制”方式

1. 启动依赖(systemd)

After=network.target
Requires=redis.service

2. 进程优先级

  • nice / renice
  • 不影响“谁先启动”,只影响调度优先级

3. 并行启动

  • systemd 默认并行
  • 不保证服务 A 一定早于 B(除非有依赖)

四、查看进程启动顺序的方法

ps -axo pid,ppid,comm
pstree
systemctl list-units --type=service
dmesg

如果你指的是:

  • 某个具体发行版(Ubuntu/CentOS/嵌入式)
  • 容器内进程启动
  • 内核线程启动顺序
  • 开机自启动脚本顺序

可以告诉我,我可以更针对性说明。

0