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 & # 重定向输出
screen
或 tmux
(会话管理)
创建虚拟终端会话,进程与终端解耦:
$ screen -S my_session # 创建会话 $ command1 # 在会话中运行程序 Ctrl+A D # 脱离会话 $ screen -r my_session # 恢复会话
tmux
更现代,支持分屏和脚本化操作。
systemd
(系统服务管理)
将进程注册为系统服务,开机自启:
- 创建服务文件:
sudo nano /etc/systemd/system/my_service.service
- 写入配置:
[Unit] Description=My Custom Service [Service] ExecStart=/path/to/command Restart=on-failure [Install] WantedBy=multi-user.target
- 启动并启用服务:
sudo systemctl start my_service sudo systemctl enable my_service
脚本批量启动
通过Shell脚本顺序或并行启动:
#!/bin/bash # 顺序执行 command1 command2 # 并行执行(使用&和wait) command1 & command2 & wait # 等待所有后台进程结束
关键注意事项
-
资源监控
- 查看进程:
ps aux
或top
- 限制资源:
ulimit -u 100
(限制最大进程数)或使用cgroups
控制CPU/内存。
- 查看进程:
-
避免进程崩溃
- 用
&&
连接命令:command1 && command2
(仅在command1成功后运行command2) - 设置守护进程:
systemd
的Restart=always
确保异常退出后重启。
- 用
-
信号处理
kill -9 PID
强制终止进程(慎用),推荐先尝试kill -15
(优雅退出)。- 捕获信号:在脚本中定义
trap 'cleanup' SIGINT SIGTERM
处理中断。
-
日志管理
重定向输出避免日志丢失:nohup command > /var/log/command.log 2>&1 &
应用场景建议
- 临时任务:
&
或screen
- 长期服务:
systemd
或nohup
- 复杂任务流:Shell脚本结合
wait
控制并行度 - 集群管理:考虑
Kubernetes
或Docker Compose
(超多进程场景)
Linux通过原生支持的多进程机制,结合&
、nohup
、systemd
等工具,可灵活管理并发任务,关键是根据需求选择方案,并监控资源防止过载,掌握这些方法,能显著提升服务器利用率和自动化效率。
引用说明基于Linux内核文档(kernel.org)、GNU Bash手册(gnu.org)及Systemd官方指南(freedesktop.org),操作命令验证环境为Ubuntu 22.04 LTS和CentOS 9。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/39479.html