正式班D23
2020.11.05星期四 正式班D23
12.3.3 HUP信号
在关闭终端时,终端会收到Linux HUP信号(hangup信号),关闭其所有子进程。
想让进程一直在后台运行不受关闭终端的影响,有以下四种方案:
nohup
在命令前加上nohup,就会从终端解除进程的关联
同时在结尾加上&来将命令放入后台运行
# 1、在终端1输入
[root@ccc ~]# nohup ping baidu.com &>/dev/null &
[root@ccc ~]# ps -elf | grep [p]ing # 查看进程
4 S root 2034 1979 0 80 0 - 37522 poll_s 15:11 pts/4 00:00:00 ping baidu.com # 2、关闭终端1 # 3、在终端2查看
[root@ccc ~]# ps -elf | grep [p]ing # 查看进程,父进程变为1即systemd进程
4 S root 2034 1 0 80 0 - 37522 poll_s 15:11 ? 00:00:00 ping baidu.com
setsid
原理与nohup一致,但setsid直接将进程的父PID设为1,即让运行的进程归属init的子进程
除非init结束,该子进程才会结束。当前终端结束不会影响进程的运行
# 1、在终端1执行命令
[root@ccc ~]# setsid ping baidu.com &>/dev/null &
[1] 2062
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2063 1 0 80 0 - 37522 poll_s 15:19 ? 00:00:00 ping baidu.com
[1]+ 完成 setsid ping baidu.com &>/dev/null # 2、关闭终端1 # 3、在终端2查看
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2063 1 0 80 0 - 37522 poll_s 15:19 ? 00:00:00 ping baidu.com
在子shell中启动进程
命令加上括号
# 1、在终端1输入命令
[root@ccc ~]# (ping vaidu.com &>/dev/null &)
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2103 1 0 80 0 - 37522 poll_s 15:24 pts/4 00:00:00 ping vaidu.com # 2、关闭终端1 # 3、在终端2查看
[root@ccc ~]# ps -elf | grep [p]ing
4 S root 2103 1 0 80 0 - 37522 poll_s 15:24 ? 00:00:00 ping vaidu.com
screen
让进程运行在新的会话里,从而成为不属于此终端的子进程,关闭终端不会被带走
# 安装screen
[root@ccc ~]# yum install screen -y
# 用法1
# 运行命令
终端1输入命令
[root@ccc ~]# screen vim 111.py
[root@ccc ~]# ps -elf | grep [v]im
4 S root 2154 2076 0 80 0 - 31934 sys_pa 15:43 pts/6 00:00:00 screen vim 111.py
5 S root 2155 2154 0 80 0 - 31967 poll_s 15:43 ? 00:00:00 SCREEN vim 111.py
4 S root 2156 2155 0 80 0 - 37444 poll_s 15:43 pts/2 00:00:00 vim 111.py 关闭终端1 在终端2查看
[root@ccc ~]# ps -elf | grep [v]im
5 S root 2155 1 0 80 0 - 31967 poll_s 15:43 ? 00:00:00 SCREEN vim 111.py
4 S root 2156 2155 0 80 0 - 37444 poll_s 15:43 pts/2 00:00:00 vim 111.py # 重新连接会话
[root@ccc ~]# screen -ls
There are screens on:
2155.pts-6.ccc (Detached)
1678.pts-0.ccc (Attached)
2 Sockets in /var/run/screen/S-root.
[root@ccc ~]# screen -r 2155
# 用法2
# 运行命令
[root@ccc ~]# screen -S cjx_pm
# screen会创建一个执行shell的全屏窗口。可执行任意shell程序
# 输入exit退出该窗口(若该screen窗口唯一,则screen会话结束,否则切换到前一窗口) # 重新连接会话
[root@ccc ~]# screen -r cjx_pm
# 已经指定了名字,可以不用进程ID直接用名字
# 测试
[root@ccc ~]# screen
[root@ccc ~]# n=1;while true;do echo $n;sleep 1;((n++));done;
按下ctrl+a和ctrl+d
此时整个终端关闭,进程并未结束
[root@ccc ~]# screen -ls
There are screens on:
2266.pts-4.ccc (Detached)
Remove dead screens with 'screen -wipe'.
1 Sockets in /var/run/screen/S-root.
[root@ccc ~]# screen -r 2266 # 进程依旧在运行
# 远程演示
在终端1
[root@ccc ~]# screen -S cz 在终端2执行的命令,终端1会同步显示
[root@ccc ~]# screen -x cz
12.4 查看网络状态
netstat
[root@ccc ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 844/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 922/master
tcp6 0 0 :::22 :::* LISTEN 844/sshd
tcp6 0 0 ::1:25 :::* LISTEN 922/master
udp 0 0 127.0.0.1:323 0.0.0.0:* 532/chronyd
udp6 0 0 ::1:323 :::* 532/chronyd -t # tcp协议
-u # udp协议
-l # listen
-p # PID/Program name
-n # 不反解,不将IP地址解析为主机名,不将端口号解析成协议名
lsof:列出打开文件(lists openfiles)
默认 : 没有选项,lsof列出活跃进程的所有打开文件
组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
-a : 结果进行“与”运算(而不是“或”)
-l : 在输出显示用户ID而不是用户名
-h : 获得帮助
-t : 仅获取进程ID
-U : 获取UNIX套接口地址
-F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止) # 1、安装
[root@ccc ~]# yum install -y lsof # 2、使用
# -i显示所有连接
[root@ccc ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 532 chrony 5u IPv4 16273 0t0 UDP localhost:323
chronyd 532 chrony 6u IPv6 16274 0t0 UDP localhost:323
sshd 844 root 3u IPv4 19131 0t0 TCP *:ssh (LISTEN)
sshd 844 root 4u IPv6 19140 0t0 TCP *:ssh (LISTEN)
master 922 root 13u IPv4 19666 0t0 TCP localhost:smtp (LISTEN)
master 922 root 14u IPv6 19667 0t0 TCP localhost:smtp (LISTEN)
sshd 2182 root 3u IPv4 47242 0t0 TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
# -i 6仅获取IPV6流量
[root@ccc ~]# lsof -i 6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 532 chrony 6u IPv6 16274 0t0 UDP localhost:323
sshd 844 root 4u IPv6 19140 0t0 TCP *:ssh (LISTEN)
master 922 root 14u IPv6 19667 0t0 TCP localhost:smtp (LISTEN)
# -i:22仅获取22端口的连接
[root@ccc ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 844 root 3u IPv4 19131 0t0 TCP *:ssh (LISTEN)
sshd 844 root 4u IPv6 19140 0t0 TCP *:ssh (LISTEN)
sshd 2182 root 3u IPv4 47242 0t0 TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
# -i@host显示指定到主机的连接
# -i@host:port显示基于主机与端口的连接
# -u 用户 显示指定用户打开了什么
# -u ^用户 显示除指定用户外其他所有用户做的事
# kill -9 `lsof -t -u 用户` 消灭指定用户运行的所有东西
# -c 命令 查看指定的命令正在使用的文件和网络连接
# -p PID 查看指定进程ID已打开的内容
# -t 只返回PID
netstat -an
[root@ccc ~]# netstat -an
[root@ccc ~]# netstat -an | grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 52 192.168.29.55:22 192.168.29.2:64066 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
12.5 proc文件系统
12.5.1 查看硬盘状态df
显示目录或文件大小du
[root@ccc ~]# du -sh /root
96K /root
查看硬盘状态df
[root@ccc ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda3 7.7G 6.3G 1.5G 82% /
/dev/sda1 473M 123M 351M 26% /boot
tmpfs 98M 0 98M 0% /run/user/0 [root@ccc ~]# df -T
文件系统 类型 1K-块 已用 可用 已用% 挂载点
devtmpfs devtmpfs 487140 0 487140 0% /dev
tmpfs tmpfs 497840 0 497840 0% /dev/shm
tmpfs tmpfs 497840 7756 490084 2% /run
tmpfs tmpfs 497840 0 497840 0% /sys/fs/cgroup
/dev/sda3 xfs 8034304 6529180 1505124 82% /
/dev/sda1 xfs 484004 125552 358452 26% /boot
tmpfs tmpfs 99572 0 99572 0% /run/user/0
12.5.2 查看内存状态free
内存:/proc/meminfo
[root@ccc ~]# less /proc/meminfo
free
[root@ccc ~]# free
total used free shared buff/cache available
Mem: 995684 148580 454780 7756 392324 655336
Swap: 1952764 0 1952764 [root@ccc ~]# free -m
total used free shared buff/cache available
Mem: 972 145 444 7 383 639
Swap: 1906 0 1906 [root@ccc ~]# free -wm
total used free shared buffers cache available
Mem: 972 144 444 7 2 381 640
Swap: 1906 0 1906 # free指当前完全没有被程序使用的内存
# cache在有需要的时候可以被释放出来供其他进程使用(不是释放所有)
# available是真正表明系统目前提供给新启动程序的内存
释放内存
[root@ccc ~]# free
total used free shared buff/cache available
Mem: 995684 148580 454780 7756 392324 655336
Swap: 1952764 0 1952764
[root@ccc ~]# cat /proc/sys/vm/drop_caches
0
[root@ccc ~]# echo 3>/proc/sys/vm/drop_caches
[root@ccc ~]# free
total used free shared buff/cache available
Mem: 995684 148012 453520 7756 394152 655904
Swap: 1952764 0 1952764
内核启动参数
[root@ccc ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=UUID=b43c52c4-89a7-48d2-83e4-6e8d35553e64 ro spectre_v2=retpoline rhgb quiet LANG=zh_CN.UTF-8
[root@ccc ~]# uptime
17:29:15 up 6:35, 2 users, load average: 0.00, 0.01, 0.05
卸载/proc及重新挂载
[root@ccc ~]# umount /proc/ -l # 卸载
[root@ccc ~]# free -m # free -m、uptime、lscpu、toop都用不了
Error: /proc must be mounted
To mount /proc at boot you need an /etc/fstab line like:
proc /proc proc defaults
In the meantime, run "mount proc /proc -t proc"
[root@ccc ~]# mount -t proc proc /proc/ # 重新挂载
12.5.3 查看CPU状态lscpu
CPU:/proc/cpuinfo
[root@ccc ~]# grep "processor" /proc/cpuinfo | wc -l # 逻辑CPU个数
1
[root@ccc ~]# grep "physical id" /proc/cpuinfo | wc -l # 物理CPU个数
1
[root@ccc ~]# grep "cpu cores" /proc/cpuinfo | wc -l # CPU核数
1
[root@ccc ~]# cat /proc/cpuinfo # 查看cpu信息
[root@ccc ~]# lscpu
12.6 管理后台进程(了解)
了解即可
[root@ccc ~]# sleep 5000 & # 后台运行
[1] 4487
[root@ccc ~]# sleep 4000 # 前台运行
^Z # ctrl+z停止
[2]+ 已停止 sleep 4000
[root@ccc ~]# jobs # []编号是作业编号
[1]- 运行中 sleep 5000 &
[2]+ 已停止 sleep 4000
[root@ccc ~]# bg %2 # 让作业2在后台运行
[2]+ sleep 4000 &
[root@ccc ~]# jobs
[1]- 运行中 sleep 5000 &
[2]+ 运行中 sleep 4000 &
[root@ccc ~]# fg %1 # 将作业1调回到前台
sleep 5000
^C # ctrl+c终止
[root@ccc ~]# jobs
[2]+ 运行中 sleep 4000 &
[root@ccc ~]# kill %2 # 杀死作业2
[root@ccc ~]# jobs
[2]+ 已终止 sleep 4000
[root@ccc ~]# jobs
12.7 管道
12.7.1 管道概念
- 管道用于进程间的通信
- 管道操作符号"|"主要用于连接左右两个命令。将左边的命令标准输出,交给右侧命令的标准输入
- 无法传递标准错误输出至后者命令
- 格式:cmd1 | cmd2[... | cmdn]
12.7.2 xargs
参数传递,让一些不支持管道的命令可以使用管道技术
[root@ccc ~]# which cat
/usr/bin/cat
[root@ccc ~]# which cat | xargs ls -l
-rwxr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
12.7.3 实例
统计当前/etc/passwd中用户使用的shell类型
[root@ccc ~]# awk -F: '{print $7}' /etc/passwd | sort | uniq -c
4 /bin/bash
1 /bin/sync
1 /sbin/halt
17 /sbin/nologin
1 /sbin/shutdown
打印当前所有的IP
[root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
::1
192.168.29.55
fe80::20c:29ff:fec0:5db3
打印根分区已用空间百分比(仅数字)
[root@ccc ~]# df -P | grep '/$' |awk '{print $5}' | awk -F"%" '{print $1}'
82
12.7.4 管道中的tee技术
-a # 追加
[root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}' | tee ip.txt
127.0.0.1
::1
192.168.29.55
fe80::20c:29ff:fec0:5db3
[root@ccc ~]# cat ip.txt
127.0.0.1
::1
192.168.29.55
fe80::20c:29ff:fec0:5db3
重定向与tee的区别
[root@ccc ~]# date > date.txt # 直接将内容写入到date.txt文件中
[root@ccc ~]# date | tee date.txt # 执行结果输出至屏幕,且保存至文件
2020年 11月 05日 星期四 18:57:32 CST
12.8 僵尸进程与孤儿进程
12.8.1 僵尸进程
操作系统负责管理进程,应用程序想开子进程都是在像操作系统发送系统调用。
当子进程死掉以后,操作系统会将子进程占用的重型资源(如内存空间、cpu资源、打开的文件等)
Linux的机制会保留子进程的进程号、退出状态、运行时间等供父进程查看
僵尸进程是Linux系统的一种数据结构,所有子进程结束后都会进入僵尸进程的状态
父进程觉得僵尸进程的数据没用以后,由父进程发起一个系统调用wait/waitpid来通知操作系统清理僵尸进程的残余状态
# 三种情况:
# 1、Linux系统自带的优秀的开源软件,在开启子进程时,父进程内部都会及时调用wait/waitpid来通知操作系统回收僵尸进程。因此我们通常看不到优秀开源软件堆积僵尸进程,因为及时回收 # 2、水平良好的程序员开发的应用程序,会在父进程内考虑调用wait/waitpid来通知操作系统回收僵尸进程,但发起系统调用时间可能慢一些,可以用命令看到僵尸进程状态
[root@ccc ~]# ps aux | grep [z]+ # 3、垃圾程序员不知道僵尸进程是什么,操作系统中就会堆积很多僵尸进程,会导致内存充足、硬盘充足、cpu空闲,但新软件无法启动起来的状况。因为僵尸进程会占用大量的PID
针对情况三,只有杀死父进程,僵尸进程就会由pid为1的顶级进程(init或systend)接手,顶级进程会定期发起系统调用wait/waitpid来通知操作系统清理僵尸进程。
针对情况二,可以发送信号给父进程,通知他发起系统调用清理僵尸进程
kill -CHLD 父进程PID
12.8.2 孤儿进程
- 父进程先死掉,而他的一个或多个子进程还在运行,这些子进程就会成为孤儿进程。
- 孤儿进程会被PID为1的顶级进程接手
- nohup、setsid原理就类似制造孤儿进程
正式班D23的更多相关文章
- 正式班D5
2020.10.10星期六 正式班D5 一.上节课复习 1.硬盘分类 1.机械磁盘 io时间=平均寻道时间+平均延迟时间 buffer:写缓冲区 cache:都缓存 2.固态硬盘 ...
- 正式班D7
2020.10.13星期二 正式班D7 一.上节课复习 Linux发展 批处理系统 多道技术 分时操作系统 multics->Unix->minix->Linux(如Redhat.c ...
- 正式班D8
2020.10.15星期四 正式班D8 一.上节课复习 OSI七层协议 socket socket是对传输层以下的封装 IP+port标识唯一一个基于网络通讯的软件 TCP与UDP TCP:因为在通信 ...
- 正式班D9
2020.10.16星期五 正式班D9 一.vmware workstation的使用 虚拟机管理软件 定义 虚拟机(Virtual Machine)软件是一套特殊的软件,它可以作为操作系统独立运行, ...
- 正式班D11
2020.10.20星期二 正式班D11 bash解释器交互式环境特性 命令和文件自动补全(Tab只能补全命令和文件) 快捷键 CTRL+C ==>终止前台运行的程序 CTRL+D ==> ...
- 正式班D12
2020.10.21星期三 正式班D12 一.目录结构 系统目录结构 目录 文件夹:存放的是具体有哪些文件 文件:存放的就是具体的数据 需要记住的 /dev/cdrom # 光盘设备,光盘里存放的内容 ...
- 正式班D13
2020.10.22星期四 正式班D13 修改文件内容 vim编辑 vim基础 可理解为Windows下的文本编辑器 vim可用来修改配置.写脚本 三种模式(命令模式.输入模式.末行模式) 命令模式按 ...
- 正式班D14
2020.10.23星期五 正式班D14 9.5 文件处理三剑客(支持|) 9.5.1 sed流式编辑器 事先制定好编辑文件的指令,让sed自动完成对文件的整体编辑(同一时间内存中只有文件中一条) # ...
- 正式班D16
2020.10.27星期二 正式班D16 目录 9.9 字符处理命令 9.9.1 sort排序 9.9.2 uniq去重 9.9.3 cut处理规律文本 9.9.4 tr替换 9.9.5 wc统计 9 ...
随机推荐
- 深入理解Callable接口
Callable接口: Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解 优点: 可以获取线程的执行结果,也称为返回值 通过与Fut ...
- Serial.begin
串口波特率的设置:通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率. 使用Serial.begin(speed, config)可以配置数据位.校验 ...
- 题解 CF149D
题目链接 首先,这是一道区间dp题: 首先我们假设 \(l\) ~ \(r\) 是一段合法的区间: 考虑状态,对于一个区间 \(l\) ~ \(r\) 的方案数,我们需要知道方案数,以及 \(l ,r ...
- QTree1 【题解】
题目背景 数据规模和spoj上有所不同 题目描述 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时 ...
- java进阶(26)--ForEach
JDK5.0后新特性 一.普通for循环
- RHSA-2018:0151-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权)
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- VMware安装的Linux系统忘记密码 怎么修改root密码
因为昨天新安装过虚拟机设置了新的密码,再加上我好长时间没有用自己旧的虚拟机,导致忘记了密码,原来虽然知道在单用模式下,找回密码,但是确实是自己从来都没有做过,还好我们组大手飞翔哥告诉了我,怎么找回ro ...
- 多测师讲解python _函数中变量_高级讲师肖sir
定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是 被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中 使用的都是局部变量.例如: num=100 #全局变量 ...
- 如何制作一个vagrant box
因为要用的窗口应用,基于服务器的各种box不能使用(曾经尝试安装桌面,没有成功).所以试着基于Ubuntu的虚拟机创建自己的box. 过程中主要参考了这篇文章:http://www.360do ...
- linux(centos8):centos8.1安装(详细过程/图解)(vmware fusion/CentOS-8.1.1911-x86_64)
一,centos是什么? CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一, 它是来自于Red Hat En ...