Linux之进程管理

进程管理

一、进程基础知识

程序 :

二进制文件,静态 /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 //刷新内核参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值