25.linux上HUP信号$僵尸进程与孤儿进程的区别
一.关于HUP信号
1.什么是HUP信号
-
hup信号除了在上一篇讲的从新加载配置文件功能外还具有另外一种功能
-
当用户注销(exit, logout, Ctrl + d),或者网络断开时,终端会收到Linux HUP 信号
-
HUP信号会使其关闭所有子进程, 这样就会关闭你不想关闭的进程
-
解决方法:
2.nohup命令
- nohup 顾名思义,就是忽略 hup 信号
- nohup 通常与 & 符号连用, 让提交的命令忽略 Linux HUP 信号
- 用法
- 示例
3.setsid命令
- 原理与 nohup 一样
- setsid 是直接将进程的父进程PID设置成 1
- 即直接让 systemd 成为该进程的父进程, 那么除非 systemd 结束,该子进程才会结束
- 用法
- 示例
4.在子shell中提交任务
- 什么是子 Shell
- 用法
- 示例
5.screen命令
- 什么是
screen
- 用法
- 常用命令选项
| -ls | 显示现有的screen会话,格式为(pid.tty.host) |
|---|---|
| -r [name/PID] | 恢复一个screen会话 |
| -S [name] | 创建一个screen会话并命名 |
| -x | 共享一个会话演示,可以操作(多个屏幕) |
| -wipe | 先检查所有screen会话, 然后删除无法使用screen会话 |
| Ctrl + d / exit | 退出screen会话 |
| Ctrl + a,Ctrl + d | 隐藏当前screen会话窗口,切到上一个窗口/终端 |
screen运行机制
使用 screen 运行一个 vim
screen vim nnn.txt然后查看进程信息
可以发现一共产生了这三个进程, 画个图👇👇👇👇👇
我们将screen这个进程 kill掉看看结果
发现对 vim 进程真的没有影响, 而 SCREEN 也被 systemd 接管了
这不就是我们使用 screen 想要的结果吗
- 示例
二.孤儿进程
1.什么是孤儿进程
- 当一个父进程创建了多个子进程, 子进程再创建子子进程等等
- 父进程因正常运行完毕或其他情况被干掉的时候, 它的子进程就变成了孤儿进程
- 为了避免孤儿进程完成任务后没有父亲通知操作系统回收资源
- 于是 PID 为 "1"的顶级进程 systemd 就接手了这个孤儿进程
- systemd 相当于一个孤儿院, 但凡是孤儿进程都会成为它的子进程
2.孤儿进程演示
- 先在一个虚拟终端里开启一个 Bash 进程,把他当做父进程
- 紧接着开启一个 "sleep 1000 &" 进程, 把它当做子进程
- 然后在另一个虚拟终端查看这两个进程信息
- 再杀掉 sleep 的父进程 Bash 看看结果如何
- 图示
三.僵尸进程
1.什么是僵尸进程
-
这是Linux出于好心的设计
-
一个父进程开启了一堆子进程, 当子进程比父进程先运行完(死掉)
-
操作系统会释放子进程占用的重型资源(内存空间, CPU资源, 打开的文件)
-
但会保留子进程的关键信息(PID, 退出状态, 运行时间等)
-
目的是为了让父进程能随时查看自己的子进程信息(不管该子进程有没有死掉)
-
这种已经死掉的子进程都会进入僵尸状态, ''僵尸进程''是Linux系统的一种数据结构
2.僵尸进程回收----概念
- 操作系统保留子进程信息供父进程查看
- 当父进程觉得不再需要查看的时候, 会向操作系统发送一个 wait / waitpid 系统调用
- 于是操作系统再次清理僵尸进程的残余信息
3.僵尸进程回收----实际
- 优秀的开源软件
- 水平良好的开发者
- 水平非常低的开发者
4.如何清理僵尸进程
- 针对良好的开发者
- 针对半吊子水平的开发者
四.查看网络状态
1.命令
netstat
2.选项
| -t | tcp协议 |
|---|---|
| -u | udp协议 |
| -l | listen |
| -p | PID/Program name |
| -n | 不反解,不将IP地址解析为主机号,不将端口号解析成协议名 |
3.示例
五.proc 文件系统
1.什么是 proc 文件系统
- proc文件系统是一个虚拟文件系统,它只存在内存当中,而不占用外存空间
2.查看CPU信息
- CPU信息文件:
/proc/cpuinfo
3.查看内存信息
- 内存信息文件:
/proc/meminfo
4.内核启动参数
- 文件:
/proc/cmdline
5.卸载与挂载 /proc
- 卸载
- 重新挂载
六.管理后台进程
1.jobs显示当前终端里的后台任务
2.bg让作业在后台运行
3.fg将作业调回前台
4.示例
七.管道
1.什么是管道
-
主要用来连接左右两个命令, 符号 "|"
-
将左侧命令的标准输出, 传给右侧命令的标准输入
-
注意: 无法传递标准错误输出至后者命令
-
用法:
command1 | command2 | command3 ......
2.管道示意图
- 示例
3.管道中的 tee 技术
- 示意图
- 示例
4.xargs 参数传递
- 让不支持管道的命令也可以使用管道内的内容
本文来自博客园,作者:ଲ小何才露煎煎饺,转载请注明原文链接:https://www.cnblogs.com/zeny/articles/14443969.html










浙公网安备 33010602011771号