当前位置:首页 > Linux > 正文

Linux如何运行多个进程?

Linux通过fork创建新进程,exec加载程序执行新任务,内核调度器为每个进程分配CPU时间片,通过快速切换实现多个进程的并发执行。

Linux多进程运行原理

Linux内核通过分时调度管理进程:

  • 进程创建:父进程调用fork()生成子进程(复制父进程资源),子进程通过exec()加载新程序。
  • 进程调度:内核按优先级分配CPU时间片,实现多进程“运行。
  • 进程状态:运行(Running)、就绪(Ready)、休眠(Sleeping)等状态动态切换。

运行多个进程的5种方法

使用 & 符号(后台运行)

在命令末尾添加 &,进程在后台启动,不阻塞终端:

$ command1 &  # 启动第一个后台进程
$ command2 &  # 启动第二个后台进程
  • 查看后台进程jobs -l
  • 调回前台fg %1(1为作业编号)
  • 终止后台进程kill %1

nohup(脱离终端运行)

进程在终端关闭后仍继续运行,输出默认保存到nohup.out

$ nohup command1 &  # 免疫SIGHUP信号
$ nohup command2 > output.log 2>&1 &  # 重定向输出

screentmux(会话管理)

创建虚拟终端会话,进程与终端解耦:

Linux如何运行多个进程?  第1张

$ screen -S my_session  # 创建会话
$ command1              # 在会话中运行程序
Ctrl+A D                # 脱离会话
$ screen -r my_session  # 恢复会话

tmux 更现代,支持分屏和脚本化操作。

systemd(系统服务管理)

将进程注册为系统服务,开机自启:

  1. 创建服务文件:
    sudo nano /etc/systemd/system/my_service.service
  2. 写入配置:
    [Unit]
    Description=My Custom Service
    [Service]
    ExecStart=/path/to/command
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
  3. 启动并启用服务:
    sudo systemctl start my_service
    sudo systemctl enable my_service

脚本批量启动

通过Shell脚本顺序或并行启动:

#!/bin/bash
# 顺序执行
command1
command2
# 并行执行(使用&和wait)
command1 &
command2 &
wait  # 等待所有后台进程结束

关键注意事项

  1. 资源监控

    • 查看进程:ps auxtop
    • 限制资源:ulimit -u 100(限制最大进程数)或使用cgroups控制CPU/内存。
  2. 避免进程崩溃

    • &&连接命令:command1 && command2(仅在command1成功后运行command2)
    • 设置守护进程:systemdRestart=always确保异常退出后重启。
  3. 信号处理

    • kill -9 PID 强制终止进程(慎用),推荐先尝试kill -15(优雅退出)。
    • 捕获信号:在脚本中定义trap 'cleanup' SIGINT SIGTERM处理中断。
  4. 日志管理
    重定向输出避免日志丢失:

    nohup command > /var/log/command.log 2>&1 &

应用场景建议

  • 临时任务&screen
  • 长期服务systemdnohup
  • 复杂任务流:Shell脚本结合wait控制并行度
  • 集群管理:考虑KubernetesDocker Compose(超多进程场景)

Linux通过原生支持的多进程机制,结合&nohupsystemd等工具,可灵活管理并发任务,关键是根据需求选择方案,并监控资源防止过载,掌握这些方法,能显著提升服务器利用率和自动化效率。

引用说明基于Linux内核文档(kernel.org)、GNU Bash手册(gnu.org)及Systemd官方指南(freedesktop.org),操作命令验证环境为Ubuntu 22.04 LTS和CentOS 9。

0