Linux-系统管理-进程管理
1.Linux-进程管理
Linux的进程管理相当于Windows的任务管理器 举例子:Windows的任务管理
程序:
进程:
守护进程:
僵尸进程:
孤儿进程:
进程管理的相关命令:ps ,top
后台管理
结束进程
系统负载
Windows的任务管理器:
1.1 进程
进程名称 | 含义 | |
程序 | 安装代码,安装包,在磁盘之上 | |
进程 | 运行中的程序称之为进程,举例:当运行一个命令时就是一个进程,远程连接的服务、网络服务 | |
守护进程 | 一直运行的进程称为守护进程,也可称为服务 |
程序的含义:如果您在一个符合大多数的计算机上,操作系统例如Windows、Linux等,加载并执行很多的程序,在这种情况下,每一个程序是一个单独的映射,并不是计算机上的所有可执行程序。它是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。
1.2 进程的种类
进程的含义
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程:正常进程和僵尸进程
(1)正常进程:
主进程process 相当于皇帝,子进程是child process 相当于大臣-----》执行任务(exec)--------》child process
(2)僵尸进程:
主进程process 相当于皇帝,子进程是child process 挂掉了,占用了系统的资源, 相当于大臣-----》执行任务(exec)--------》child process 。
僵尸进程是子进程比父进程先结束,父进程没有回收子进程,释放子进程占用资源,这时子进程成为僵尸进程。
处理如下:找到僵尸进程上级进程,主进程重启Linux 其它进程结束。
展示僵尸进程
[root@localhost ~]# cat zombine.c
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
* desc:用于模拟僵尸进程.代码.zhuixin.com
*
*/
int main(int argc,char *(argv[]))
{
pid_t pid;
pid = fork();
if (pid == 0) {
int iPid = (int)getpid();
fprintf(stderr,"I am child,%d\n",iPid);
sleep(1);
fprintf(stderr,"Child exits\n");
return EXIT_SUCCESS;
}
int iPid = (int)getpid();
fprintf(stderr,"I am parent,%d\n",iPid);
fprintf(stderr,"sleep......\n");
sleep(600);
fprintf(stderr,"parent exits\n");
return EXIT_SUCCESS;
}
c语言进行编译安装gcc 命令
[root@localhost ~]# yum -y install gcc
进行编译
[root@localhost ~]# gcc zombine.c -o zombine.c
执行
[root@localhost ~]# ./zombine.c
这是僵尸进程 zombie
过滤僵尸进程:过滤僵尸进程Z
解决僵尸进程:首先找到僵尸进程上级进程
过滤出僵尸进程的父进程
[root@localhost ~]# pstree -p
systemd(1)─┬─NetworkManager(1154)─┬─{NetworkManager}(1161)
│ └─{NetworkManager}(1170)
├─VGAuthService(938)
├─abrt-watch-log(942)
├─abrtd(940)
├─agetty(966)
├─auditd(875)───{auditd}(876)
├─crond(959)
├─dbus-daemon(933)───{dbus-daemon}(934)
├─firewalld(1017)───{firewalld}(1310)
├─lvmetad(508)
├─master(1639)─┬─pickup(3594)
│ └─qmgr(1643)
├─polkitd(949)─┬─{polkitd}(969)
│ ├─{polkitd}(970)
│ ├─{polkitd}(971)
│ ├─{polkitd}(976)
│ ├─{polkitd}(1005)
│ └─{polkitd}(1013)
├─rsyslogd(1486)─┬─{rsyslogd}(1490)
│ └─{rsyslogd}(1497)
├─sshd(1484)─┬─sshd(2993)───bash(2997)───zombine.c(3833)───zombine.c(3834) 结束僵尸的上级进程
│ └─sshd(3786)───bash(3790)───pstree(3843)
├─systemd-journal(483)
├─systemd-logind(932)
├─systemd-udevd(519)
├─tuned(1487)─┬─{tuned}(1727)
│ ├─{tuned}(1728)
│ ├─{tuned}(1730)
│ └─{tuned}(1732)
└─vmtoolsd(945)───{vmtoolsd}(1035)
结束僵尸进程的父进程
[root@localhost ~]# kill 3833
(3)孤儿进程
孤儿进程是在其父进程执行完成或被终止后仍继续运行,孤儿进程直接被系统直接接管(systemd进程)。
2. 进程状态的相关命令
进程的内置命令 | 含义 | |
ps | ps命令查看当前一会的进程状态,用于检查或者取值 | |
top | top命令是动态的查看,按q退出,负载,僵尸进程,cpu,内存,相当于Windows的任务管理器 |
(1)ps 命令
ps -ef
UID 进程属于的用户
PID 进程的id号 绝大部分是随机的
PPID 是父进程的id号 pstree -p 查看详细关系
CMD 进程的名字 带中阔号是内核中的
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 04:07 ? 00:00:07 /usr/lib/systemd/systemd --switched-root --syst
root 2 0 0 04:07 ? 00:00:00 [kthreadd]
ps aux的命令每一列含义
第1列 进程属于哪个用户
第2列 这个进程的进程号
第3列 进程使用掉的CPU百分比
第4列 进程占用物理内存的百分比
第5列 占用虚拟内存VSZ 单位:Kbytes
第6列 占用物理内存 RSS 单位:Kbytes
第7列 终端TTY ,终端在哪个终端机上运行的,与这个终端机无关 则显示“?”,
第8列 STAT 进程状态 R:正在运行 S:正在中断睡眠 D:不可中断睡眠 T:停止
Z:已经终止,其父进程无法正常运行 ,变成僵尸进程(zomble)的状态
+:前台运行 :多线程模式 N:低优先级进程 <:高优先级进程 s:进程领导者
L:将页面锁定在内存中
第9列 START 进程启动时间
第10列 TIME 进程使用CPU的时间
第11列 COMMAND 进程的实际命令
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128408 7036 ? Ss 04:07 0:07 /usr/lib/systemd/systemd --swit
root 2 0.0 0.0 0 0 ? S 04:07 0:00 [kthreadd]
ps aux命令查看每一列的含义
ps命令选项参数详解
参数选项 | 含义 | |
-a | 显示终端下执行的过程 | |
a | 显示终端的所有进程,含概进程的完整路径 | |
x | 终端无关的进程 | |
u | 终端无关的进程 | |
-u | 用户相关的进程信息 | |
-e | 显示所有进程 | |
-f | 显示UID 、PID… | |
-H | 进程树 | |
-I | 显示详细的进程状态 | |
-o | 输出指定字段,以逗号分隔 |
进程状态STAT
STAT进程的状态 | 含义 | |
R(running ) | 进程运行 | |
S | 可中断进程(可以随时停止) | |
T(terminate) | 进程被暂停\挂起 ctrl +z | |
D | 不可中断进程(IOduxie) | |
Z zombie | 僵尸进程 | |
s | 进程是控制进程,Ss进程的领导者,父进程/主进程 | |
< | 进程运行在高优先级上,S<优先级较高的进程 | |
N | 进程运行在低优先级上,SN优先级较低的进程 | |
+ | 当前进程运行在前台,R+表示进程运行在前台 | |
l(小写L) | 进程是多线程的,Sl 表示进程以多线程运行(与程序) |
进程状态
R+ 前台运行中的进程
R 后台运行的进程
S 可中断进程
T 后台挂起的进程(挂起的相关命令)
D 不可中断的进程(io 进程读写)
Ss 可中断进程、管理进程
S< 可中断的高优先级进程
Ssl 可中断的多线程的管理进程
Z 僵尸进程
(2) top命令
swap叫交换分区,当内存不足的时候临时充当为内存,swap本质是磁盘上面的一块空间,速度没有内存快
速度比对:cpu------>内存--------->磁盘
[root@localhost ~]# top
详细用户信息
通过w查看 , 查看负载:衡量系统繁忙程度w/uptime
上机时间开机多久, 登录用户, 平均负载 :1分钟,5分钟,15分钟
第1行 w/uptime top - 11:02:40 up 17:14 , 3 users, load average: 0.02, 0.02, 0.05
106个进程,1个运行中 R,105个休眠S/Ss, 0个挂起的T,0个僵尸进程 Z
第2行 进程汇总信息 Tasks: 106 total, 1 running, 105 sleeping , 0 stopped, 0 zombie
user用户使用率cpu,system系统CPU,nice高优先级,idle空闲进程,walt io等待,硬中断,软中断,虚拟机steal
第3行 CPU使用率信息 %Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
总内存, 可用内存,已用内存,缓存/缓冲占用内存
第4行 内存使用情况 KiB Mem : 2027876 total, 1231980 free, 208932 used, 586964 buff/cache
总swap, 可用swap, 已用swap,当前可用内存
第4行 Swap使用情况 KiB Swap: 2097148 total, 2097148 free, 0 used. 1656148 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
945 root 20 0 305500 6564 5156 S 1.3 0.3 6:14.55 vmtoolsd
4241 root 20 0 161992 2188 1552 R 0.3 0.1 0:00.10 top
1 root 20 0 128408 7036 4164 S 0.0 0.3 0:08.08 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:04.71 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:03.02 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:06.05 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kdevtmpfs
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
15 root 20 0 0 0 0 S 0.0 0.0 0:00.07 khungtaskd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
(3) 举例子
过滤出xxx的进程
过滤出的结果通过grep -v grep 排除grep命令自己本身的进程
[root@localhost ~]# ps aux |grep xxx
[root@localhost ~]# ps -ef |grep xxx
按照树形查看进程信息
pstree -p 命令显示树形结构,并展示pid
用于查看进程间的关系
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─abrt-watch-log
├─abrtd
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash
│ └─sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
[root@localhost ~]# pstree -p
systemd(1)─┬─NetworkManager(1154)─┬─{NetworkManager}(1161)
│ └─{NetworkManager}(1170)
├─VGAuthService(938)
├─abrt-watch-log(942)
├─abrtd(940)
├─agetty(966)
├─auditd(875)───{auditd}(876)
├─crond(959)
├─dbus-daemon(933)───{dbus-daemon}(934)
├─firewalld(1017)───{firewalld}(1310)
├─lvmetad(508)
├─master(1639)─┬─pickup(4854)
│ └─qmgr(1643)
├─polkitd(949)─┬─{polkitd}(969)
│ ├─{polkitd}(970)
│ ├─{polkitd}(971)
│ ├─{polkitd}(976)
│ ├─{polkitd}(1005)
│ └─{polkitd}(1013)
├─rsyslogd(1486)─┬─{rsyslogd}(1490)
│ └─{rsyslogd}(1497)
├─sshd(1484)─┬─sshd(4065)───bash(4069)
│ └─sshd(4452)───bash(4456)───pstree(4856)
├─systemd-journal(483)
├─systemd-logind(932)
├─systemd-udevd(519)
├─tuned(1487)─┬─{tuned}(1727)
│ ├─{tuned}(1728)
│ ├─{tuned}(1730)
│ └─{tuned}(1732)
└─vmtoolsd(945)───{vmtoolsd}(1035)
[root@localhost ~]# ps auxf
取某些部分的内容
NR 代表行号 行号>1 NR>1 、行号>=2 NR>=2 , NF是列 (NF-1)
使用awk取列
[root@localhost ~]# ps aux |awk '{print $1,$2,$3}'
ps 命令的选项,可以输出指定的内容
[root@localhost ~]# ps -axo user,%cpu,stat
awk 命令写法,排除第一行,从第二行开始 NR:代表行号
awk格式语法
awk '{print 某一列$1}'
awk '条件{print 某一列}'
[root@localhost ~]# ps aux |awk 'NR>1{print $1,$3}'
awk取最后列 NF是最后的列
[root@localhost ~]# echo 1 a b c zhx 889 |awk '{print $NF}'
889
[root@localhost ~]# echo 1 a b c zhx 889 |awk '{print $NF-1}'
888
[root@localhost ~]# echo 1 a b c zhx 889 |awk '{print $(NF-1)}'
zhx
ps 不输出每一列的标题 --no-heading 不显示标题
[root@localhost ~]# ps --no-heading axo user,%cpu,stat
ps 命令过滤所有
[root@localhost ~]# ps axo user,%cpu,%mem,command
USER %CPU %MEM COMMAND
ps 过滤指定的进程
-o 指定输出
[root@localhost ~]# ps -o pid,%cpu,%mem,command -C crond
PID %CPU %MEM COMMAND
959 0.0 0.0 /usr/sbin/crond -n
取出进程中使用率最高的前几名
[root@localhost ~]# ps --no-heading aux |sort -rnk4
取前五名
[root@localhost ~]# ps --no-heading aux |sort -rnk4 |head -5
[root@localhost ~]# ps aux --sort=%mem|head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 10月10 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 10月10 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 10月10 0:06 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 10月10 0:00 [migration/0]
[root@localhost ~]# ps --no-heading aux --sort=%mem|head -5
root 2 0.0 0.0 0 0 ? S 10月10 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 10月10 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 10月10 0:06 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 10月10 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 10月10 0:00 [rcu_bh]
top命令的快捷键
top的命令默认三秒种刷新一次,按空格键瞬间刷新一次
按键q 退出
P 默认情况下是使用%CPU使用率进行排序
M 是按照内存使用率进行排序
top进入输入z键进入颜色模式,按x标记当前是按照哪列进行排序。
shift + >向右
shift + <向左
top命令的升级版htop命令
按q 退出 哪里不会点击哪里
htop 命令是epel源中的命令,没有配置epel源安装。
top命令是交互式的
如果取出第三行,光标会卡在不动需要按q退出,这种还不方便取出,需要非交互式的取出
top的选项参数:
-b 命令行模式
-n 显示几次刷新结果,默认是显示3秒刷新一次
[root@localhost ~]# top -b n1 |awk 'NR==3'
%Cpu(s): 0.0 us, 11.8 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
[root@localhost ~]# top -bn1 |awk 'NR==3'
%Cpu(s): 0.0 us, 11.8 sy, 0.0 ni, 88.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st