进程管理
一、进程基础知识
程序 :
二进制文件,静态 /usr/sbin/httpd,/usr/sbin/sshd
进程 :
是程序运行的过程, 动态,有生命周期的,可以产生和消亡的(进程是已启动的可执行程序的运行
实例,实例即运行可执行程序)。
线程 :
线程是进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程;一个进程至少包括
一个线程,通常将该线程称为主线程;一个进程从主线程的执行开始,进而创建一个或多个附加线程,就
是所谓基于多线程的多任务。
进程的生命周期
父进程:
程序运行时产生的第一个进程,任何进程都可以作为父进程创建子进程。
子进程:
由父进程使用fork()函数完全复制自己的地址空间创建出来的新的进程就是子进程,子进程继承父
进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码,随后,子进
程可能exec自己的程序代码。
poccess id:
为父进程跟踪和安全性以及管理人员的控制和管理所需,父进程会给子进程分配一个唯一的
进程id,这个id就是pid
进程状态
R:
包含runnable和running,表示进程正在等待运行或者是正在cpu上运行
Sleeping: 包含S、D、K三种状态
S:
可中断睡眠,进程在等待事件触发/接收到指定的信号(硬件请求/系统之间的访问)才会运行起
来。
D:
不可中断睡眠,不会接收或者是相应外界传来的信号,通常情况下正在进行I/O操作
K:
和D的状态相同,但是可以被中断
Stopped:
T状态,表示进程被停止,通常是由用户或者是其他进程发送的信号。
Zombie:
包含X、Z两种状态
Z:
除了pid之外,其他的资源都已经释放掉,给父进程发送退出信号之后进入到Z状态
X:
父进程清理掉子进程剩余的结构体之后,子进程就进入到死亡的状态
二、查看进程
==静态ps
[root@ever ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2164 648 ? Ss 08:47 0:00 /usr/lib/systemd/systemd
56/214
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存,包括程序、代码、共享库等所有的
RSS: 占用实际内存 驻留内存
TTY: 进程运行的终端,?表示不依赖于任何的终端
STAT: 进程状态
R 运行
S 可中断睡眠 Sleep
D 不可中断睡眠
T 停止的进程
Z 僵尸进程
X 死掉的进程
【了解 】
Ss s进程的领导者,父进程
S< <优先级较高的进程
SN N优先级较低的进程
R+ +表示是前台的进程组
Sl 以线程的方式运行
START: 进程的启动时间
TIME: 进程占用CPU的总时间,单位是minute
COMMAND: 进程文件,进程名
ps aux --sort rss |less //升序排序
ps aux --sort -rss |less //降续排序
自定义显示字段
[root@ever ~]# ps axo user,pid,ppid,%mem,command
[root@ever ~]# ps axo user,pid,ppid,%mem,command |grep bash
alice 29371 29353 0.3 -bash
root 30314 2677 0.3 bash
root 31443 2677 0.3 bash
root 31457 31443 0.1 grep bash
[root@ever ~]# ps -ef //unix风格
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:47 ? 00:00:00 init [5]
查看指定进程的PID
[root@ever ~]# ps aux |grep sshd
root 10180 0.0 0.0 7224 1024 ? Ss 16:00 0:00 /usr/sbin/sshd
[root@www ~]# man pgrep
57/214
[root@ever ~]# pgrep -l sshd //不加l就不显示进程的名字
10180 sshd
[root@ever ~]# pgrep sshd
10180
[root@www ~]# pgrep -uroot sshd
10180
[root@www ~]# pgrep -uapache,root
[root@ever ~]# cat /var/run/sshd.pid
10180
[root@ever ~]# pidof sshd
10180
==动态top
[root@ever ~]# top
[root@ever ~]# top -d 1 一秒钟变化一次
[root@ever ~]# top -d 1 -p 10126 查看指定进程的动态信息
[root@ever ~]# top -d 1 -p 1,2,3 查看sshd的同时查看pid号为1的进程
[root@ever ~]# top -d 1 -u qemu 查看指定用户的进程
[root@ever ~]# top -b -n 2 > top.txt 将2次top信息写入到文件
第一部分:系统整体统计信息
top - 14:22:36 up 4:45, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 206 total, 2 running, 204 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.6%us, 0.7%sy, 0.0%ni, 96.8%id, 0.9%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4019424k total, 1327584k used, 2691840k free, 131012k buffers
Swap: 2047992k total, 0k used, 2047992k free, 650880k cached
load average: 0.23, 0.06, 0.02 1分钟,5分钟,15分钟之内系统的平均负载
us:用户占用的cpu的百分比 sy:内核占用的cpu的百分比 ni 改变过优先级的进程占用的cpu的百分
比
id:cpu的空闲时间 wa:cpu的IO等待的时间 hi:硬中断占用的cpu的百分比 si:软中断
st:cpu被偷走的时间
第二部分:进程信息
命令
h或?获得帮助
M 按内存的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 对排序进行反转
f 自定义显示字段,调整字段顺序(选中正行上下箭头调整)
1 显示所有CPU的负载
W 保存top环境设置 ~/.toprc
< 向前
> 向后 一页显示不了,向后翻页
z 彩色
[root@localhost ~]# atop
[root@localhost ~]# htop
三、使用信号控制进程
[root@ever ~]# kill -l //列出所有支持的信号
编号 信号名
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断^C
3) SIGQUIT 键盘退出^\
9) SIGKILL 强制终止,不可忽略,不可拦截
15) SIGTERM 终止(正常退出,干净)默认信号,可忽略
18) SIGCONT 继续,不可拦截
19) SIGSTOP 停止,不可忽略
20)SIGTSTP 暂停^Z
练习1:
给sshd/httpd进程发送1,15信号
[root@ever ~]# ps aux |grep sshd
root 1925 0.0 0.0 64116 44 ? Ss Jul25 0:00 /usr/sbin/sshd
[root@ever ~]# kill -hup 1925
[root@ever ~]# ps aux |grep sshd
root 32701 0.0 0.2 64116 1144 ? Ss 19:27 0:00 /usr/sbin/sshd
[root@ever ~]# service sshd reload
[root@ever ~]# ps aux |grep httpd
root 8849 0.0 0.0 184148 4216 ? Ss 04:55 0:00 /usr/sbin/httpd
apache 8852 0.0 0.0 184280 2464 ? S 04:55 0:00 /usr/sbin/httpd
...
[root@ever ~]# kill -1 8849 //发送重新加载信号
[root@ever ~]# ps aux |grep httpd
root 8849 0.0 0.0 7224 1028 ? Ss 15:42 0:00 /usr/sbin/httpd
apache 8878 0.0 0.0 184280 2520 ? S 04:56 0:00 /usr/sbin/httpd
...
[root@ever ~]# vim /etc/httpd/conf/httpd.conf
[root@ever ~]# kill -1 8849
[root@ever ~]# ps aux |grep httpd
[root@ever ~]# kill 8849 //发送停止信号
[root@ever ~]# ps aux |grep sshd
root 9953 0.0 0.0 4264 676 pts/1 R+ 15:44 0:00 grep sshd
练习2:
给vim进程发送9,15信号
[root@ever ~]# touch file1 file2
[root@ever ~]# tty
/dev/pts/1
[root@ever ~]# vim file1
[root@ever ~]# tty
/dev/pts/2
[root@ever ~]# vim file2
[root@ever ~]# ps aux |grep vim
root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1
root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2
[root@ever ~]# kill 4362
[root@ever ~]# kill -9 4363
[root@ever ~]# killall vim //给所有vim进程发送信号
[root@ever ~]# killall httpd
练习3:
给sshd进程发送18,19信号
[root@ever ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd
[root@ever ~]# kill -STOP 5571
[root@ever ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ts 09:35 0:00 /usr/sbin/sshd
[root@ever ~]# kill -cont 5571
[root@ever ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd
练习4:
踢出一个从远程登录到本机的用户
[root@ever ~]# pkill --help
[root@ever ~]# pkill -u alice
[root@ever ~]# ssh root@172.16.110.1 //别人服务器的IP
[root@ever ~]# sleep 1000 //执行完命令之后,将这个终端放在这里不要动
重新打开另外一个终端,执行w命令
[root@localhost ~]# w
04:42:24 up 13:22, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 172.16.110.245 04:41 5.00s 0.00s 0.00s sleep 1000
root tty1 :0 Fri08 4days 47.16s 47.16s /usr/bin/Xorg :
root pts/1 :0.0 Mon04 0.00s 0.06s 0.00s w
root pts/2 :0.0 Mon04 24:25m 0.00s 0.00s bash
[root@localhost ~]# pkill -t pts/3 //只是杀掉终端上的进程
[root@localhost ~]# pkill -9 -t pts/3 //连终端都一起杀掉了
查看踢出去的效果
[root@ever ~]# sleep 1000
Connection to 172.16.110.1 closed
四、进程的优先级
Linux 进程调度及多任务
每个CPU在一个时间点上只能处理一个进程,而Linux实际能够运行的进程数远远超出实际可用的
CPU核心数量,这是因为有时间片技术。Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而
给用户多个进程在同时运行的印象。
相对优先级 nice
由于每个进程的重要性不同,所以他们被分到的cpu时间片也不同,这取决于进程的优先级,优先级
有很多种,使用什么样的优先级取决于内核采用的不同的调度策略,进程调度程序(cfq)会为不同的进程
使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略为 SCHED_OTHER (也称为
SCHED_NORMAL),只有这种调度策略运行的进程的相对优先级称为进程的 nice 值,可以有40种不同级
别的nice值。优先级越高,进程更不倾向与让出CPU;nice值越高,优先级越低,进程更容易将cpu使用量
让给其他进程。
查看进程的nice级别
1.使用top命令查看
NI: 实际nice级别
PR: 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
2.使用ps命令查看
[root@ever ~]# ps axo pid,command,cls,nice --sort=-nice
TS 表示该进程使用的调度策略为SCHED_OTHER
启动不同nice级别的进程
启动进程时,通常会继承父进程的 nice级别,默认为0。
[root@ever ~]# nice -n -5 sleep 6000 & //程序运行时设置优先级,并且将进程放到后台运
行,不占用当前终端
[root@ever ~]# ps axo command,pid,nice |grep sleep
更改已经运行进程的nice值
1.使用top命令更改nice级别
r 调整进程的优先级(Nice Level) (-20高) ---0--- (19低)
2.使用shell更改nice级别
[root@ever ~]# sleep 1000 &
[1] 7412
[root@ever ~]# renice -20 7412 //对已运行的进程设置新的优先级
7412: old priority 0, new priority -20
五、作业控制
作业控制是一个命令行功能,可以允许一个shell实例来运行和管理多个进程。
如果没有作业控制,父进程fork()一个子进程后,将进入sleeping状态,直到子进程退
出。
使用作业控制可以选择性暂停、恢复以及异步运行进程,让shell可以在子进程运行期
间返回接受其他命令
进程前台、后台
前台:前台进程会占用当前终端,当前终端为该进程的控制终端,进程会接收键盘产生的
输入信号
后台:后台进程没有控制终端,不需要终端的交互,不接收终端输入的信号
[root@ever ~]# vim /etc/hosts //^Z,将前台的这个进程调到后台且处于停止的状态
[1]+ Stopped vim /etc/hosts
[root@ever ~]# sleep 3000 & //运行程序(时),让其在后台执行
[2] 8735
[root@ever ~]# sleep 2000 //^Z,将前台的程序挂起(暂停)到后台
[root@ever ~]# ps aux |grep sleep
62/214
root 8895 0.0 0.0 100900 556 pts/0 S 12:13 0:00 sleep 3000
root 8896 0.0 0.0 100900 556 pts/0 T 12:13 0:00 sleep 2000
[root@ever ~]# jobs //查看后台作业
[1]+ Stopped vim /etc/hosts
[2] Running sleep 2000 &
[3]- Running sleep 3000 &
[root@ever ~]# fg //调回最近使用的命令,带“+”号的
[root@ever ~]# bg %2 //让作业2在后台运行
[root@ever ~]# fg %1 //将作业1调回到前台
[root@ever ~]# kill %1 //kill 1,杀死PID为1的进程
这些本身都是进程,但是在同一个终端中我们可以把他们看成是作业,且作业只在当前终端生效
企业案例1:
[root@www ~]# while : ; do date ; sleep 2 ; done
[root@www ~]# while : ; do date ; sleep 2 ; done &
[root@www ~]# (while : ; do date ; sleep 2 ; done) &> /dev/null
[root@www ~]# (while : ; do date ; sleep 2 ; done) &> /dev/null &
&放在命令的最后面才表示后台符
企业案例2:
[root@ever ~]# ssh 172.16.50.240
[root@client ~]# yum -y install screen
[root@client ~]# screen -S install_apache //为接下来的操作起个名字
==断网后,重新连接==
[root@client ~]# screen -list
There are screens on:
28958.install_nginx (Detached)
29013.install_apache (Detached)
2 Sockets in /var/run/screen/S-root.
[root@client ~]# screen -r 29013
六、管理网络进程
ports and services
网络服务是通过socket的方式提供服务的,使用ss命令查询常用的选项
[root@www ~]# ss --help
-n 不解析服务的名字
-a 显示所有套接字
-l 显示监听(Listen)的端口
-t 显示tcp的套接字或者是服务
-u 显示udp的套接字或者是服务
-p 显示进程的名字
1、Show TCP sockets(LISTEN)
[root@www ~]# ss -t //tcp的套接字
[root@www ~]# ss -tl //监听的服务,状态是listen的
[root@www ~]# ss -tnl //不显示协议名
[root@www ~]# ss -tnlp //显示服务名
[root@www ~]# ss -ant //查看所有状态的,包括监听和建立连接的,此时无需l 选项。
[root@www ~]# ss -ant |grep :5900
[root@www ~]# ss -ant |grep :80
[root@www ~]# ss -ant |grep :22
[root@www ~]# ss -ant |grep :21
2、Show UDP sockets(所有状态)
udp的协议比较少
[root@www ~]# ss -anu
七、proc文件系统
虚拟的文件系统:内核、进程运行的状态信息,存放的大多是进程相关的目录
[root@ever ~]# ll -dh /proc/
dr-xr-xr-x 208 root root 0 9月 30 08:08 /proc/
[root@ever ~]# du -sh /proc/
0 /proc/
/proc/cpuinfo
[root@ever ~]# less /proc/cpuinfo //查看cpu相关的信息
[root@ever ~]# grep 'processor' /proc/cpuinfo //查看逻辑cpu的个数
processor : 0 //0号处理器
processor : 1
[root@ever ~]# grep 'physical' /proc/cpuinfo //查看物理cpu的个数
physical id : 0
address sizes : 36 bits physical, 48 bits virtual
physical id : 0
address sizes : 36 bits physical, 48 bits virtual
[root@localhost ~]# cat /proc/cpuinfo | grep --color lm //支持64位系统(length mode)
[root@localhost ~]# cat /proc/cpuinfo | grep --color vmx //是否支持intel的硬件虚拟化
[root@localhost ~]# cat /proc/cpuinfo | grep --color svm //是否支持AMD的硬件虚拟化
[root@ever shell]# lscpu //将cpuinfo文件归类显示
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1 //1个插槽即1路的处理器
/proc/meminfo
[root@ever 桌面]# cat /proc/meminfo
[root@ever 桌面]# free -m
total used free shared buffers cached
Mem: 7757 2314 5443 0 90 1586
-/+ buffers/cache: 637 7119
Swap: 4095 0 4095
/proc/cmdline
当前启动系统之后内核生效的参数
[root@ever 桌面]# cat /proc/cmdline //内核参数
ro root=UUID=59fe9aaf-21c7-4451-9d21-584aec546564 rd_NO_LUKS KEYBOARDTYPE=pc
KEYTABLE=us rd_NO_MD LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
系统负载
[root@ever 桌面]# uptime
09:00:52 up 5:15, 2 users, load average: 0.15, 0.09, 0.08
查看/proc的挂载
[root@ever ~]# mount
将/proc卸载掉
[root@ever ~]# umount /proc/ -l
[root@ever ~]# free -m
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@ever ~]# uptime
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@ever ~]# lscpu centos7
baseurl=ftp://172.16.8.100/centos7u2/
enabled=1
lscpu: cannot open /proc/cpuinfo: 没有那个文件或目录
[root@ever ~]# top
top: /proc is not mounted, required for output data
重新挂载proc文件系统
[root@ever ~]# mount -t proc proc /proc/
-t 指定文件系统类型
proc 文件系统,虚拟的文件系统
/proc挂载点
修改内核参数
[root@localhost ~]# echo 1 > /proc/sys/vm/drop_caches 释放内存
1 buffer 2 cache 3 buffer和cache
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 是否开启路由转发功能
配置文件
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
注释:
rp_filter即reverse-pathfiltering,反向过滤技术,系统在接收到一个IP包后,检查该IP是不是合乎要求,不
合要求的IP包会被系统丢弃。
[root@localhost ~]# sysctl -p //刷新内核参数