Linux基础21 进程监控状态ps,进程相关命令pstree,pgrep,pidof,进程监控top,进程中断,kill停止进程信号pkill,killall,综合监控工具glances,查看进程打开文件lsof,cockpit

1.进程的管理:

当我们运行一个程序,那么我们将该程序叫进程
进程 线程 协程

linux起服务会有给这个服务预分配的内存结构, windows没有

 

2.为什么要学进程管理?

为了管理架构的服务

 

3.程序和进程的区别

1)程序:开发写出来的代码,程序是永久存在的。
2)进程:它会随着程序的终止而销毁。

 

4.进程的生命周期

1.当父进程接收到任务调度时,会通过fork派生子进程来处理,那么子进程会继承父进程的衣钵。
2.子进程在处理任务代码时,父进程会进入等待的状态...(等待子进程给父进程返回结果)。如果子进程退出,父进程会继续fork出新的子进程
3.如果子进程在处理任务过程中,父进程退出了,子进程没有退出,那么这些子进程就没有父进程来管理了,就变成了僵尸进程。
4.每个进程都会有自己的PID号,(process id)子进程则PPID

僵尸进程

进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(zombie)进程。
这样就会导致 如果进程不调用wait()或waitpid()的话,那么保留的那段信息就不会释放,
其进程号就会 一直被占用,但系统所能使用的进程号是有限的,如果大量产生僵尸进程,
将因为没有可用进程号而导 致系统不能产生新的进程,此即为僵尸进程的危害。

孤儿进程

如果在子进程在退出前,父进程先退出,这时子进程将成为孤儿进程,因为它的父进程已经死了。
孤儿进程会被PID=1的systemd进程收养,成为systemd的子进程。 注意,孤儿进程还会继续运行,而不会随父进程退出而终止,只不过其父进程发生了改变。

 

5.进程管理命令(静态管理):ps

-a        #显示所有与终端相关的进程(选项包括所有终端中的进程)
-u        #显示用户
-x        #显示所有与终端无关的进程(选项包括不链接终端的进程)
-e        #显示所有进程,相当于-A
-f         #显示完整格式程序信息
-F         #显示更完整格式的进程信息
-H         #以进程层级格式显示进程相关信息
-p pid     #显示指pid的进程
--ppid pid  #显示属于pid的子进程
-t ttylist     #指定tty,相当于 t
#用户
USER        
#进程号
PID 
#占CPU的百分比
%CPU 
#占内存的百分比
%MEM    
#虚拟内存
VSZ   
#物理内存
RSS 
#该进程在哪个终端运行
TTY
    tty1:        物理机的终端
    pts/0:        远程连接的终端
    ?:        内核运行的终端(表示为守护进程)
    
#状态
STAT
    S:进入睡眠状态的进程(可中断) (等cpu处理完成或等待cpu处理)
    s:父进程
    R:正在运行的进程
    D:不可中断的进程 (比如磁盘IO无法终端, 除非kill -9强行杀死)
    N:优先级低
    <:优先级高
    l:多线程的
    +:在前台运行的进程
    T:暂停,停止的进程
    Z:僵尸进程
----------------------------
    L:页被锁进内存
    |:多进程的
   l,小写L 空转进程,Centos8新特性
#进程启动时间 START #进程使用CPU的时间 TIME #程序运行的命令 (方括号[]包着的是内核的进程,没有[]为命令的进程) COMMAND

 

进程相关的命令:

常用组合
#显示所有所有进程,并列出属主
ps aux
#显示所有所有进程,并列出属主
ps -ef
#详细格式显示所有进程
ps -eFH
#查询你拥有的所有进程
ps -x
#显示指定的进程ID对应的进程
ps -fp 1234

1.按照某一列排序:

[root@oldboyedu ~]# ps aux --sort vsz

2.指定想查看的列 # o: 指定想要看到的列

[root@oldboyedu ~]# ps axo user,pid,vsz,command
[root@oldboyedu ~]# ps axo pid,nice,command    # nice优先级

3.查看子进程 # f:  查看子进程

[root@oldboyedu ~]# ps auxf |grep [n]ginx    # 本质上,相当于进程中有一个grep [n]ginx,但是查询的时候是,grep nginx(正则表达式的结果)
root     119884  0.0  0.1 125108  2256 ?        Ss   10:06   0:00 nginx: master process /usr/sbin/nginx
nginx    119885  0.0  0.1 125496  3140 ?        S    10:06   0:00  \_ nginx: worker process    # 有脐带\_, 就是子进程
nginx    119886  0.0  0.1 125496  3140 ?        S    10:06   0:00  \_ nginx: worker process
nginx    119887  0.0  0.1 125496  3140 ?        S    10:06   0:00  \_ nginx: worker process
nginx    119888  0.0  0.1 125496  3140 ?        S    10:06   0:00  \_ nginx: worker process

4.额外命令:pstree

#常用选项
-a|--arguments     #显示该进程的完整指令及参数
-h|--highlight-all #高亮显示当前进程及父进程
-H PID|--highlight-pid=PID #高亮显示指定进程及父进程
-l|--long         #不要截断长线
-n|--numeric-sort #根据PID排序显示
-p|--show-pids     #显示PID,包含 -c 选项
-s|--show-parents #显示父进程
-S|--ns-changes   #显示命名空间
-t|--thread-names #显示完整线程名称
-T|--hide-threads #不显示线程
-u|--uid-changes   #显示进程切换

查看进程树: [root@oldboyedu
~]# pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─VGAuthService      ... ├─vmtoolsd───{vmtoolsd} └─vsftpd

[root@ubuntu 726]#pstree -p   #{}为线程,没有为进程
systemd(1)─┬─ModemManager(884)─┬─{ModemManager}(914)
       │ └─{ModemManager}(922)
       ├─cron(855)
       ├─multipathd(555)─┬─{multipathd}(568)
       │ ├─{multipathd}(570)
       │ ├─{multipathd}(571)
       │ ├─{multipathd}(574)
       │ ├─{multipathd}(575)
       │ └─{multipathd}(576)


#显示父进程
[root@ubuntu ~]# pstree -sp 11916
systemd(1)───sshd(1146)───sshd(11860)───sshd(11864)───bash(11867)───passwd(11916
)

pgrep

#默认不加选项是查看进程的pid  pgrep(了解)

[root@oldboyedu ~]# pgrep -l -a nginx
[root@oldboyedu ~]# pgrep sshd    # 展示pid
119346
120226
120254
[root@oldboyedu ~]# pgrep -l sshd    # 追加名字
119346 sshd
120226 sshd
120254 sshd
[root@oldboyedu ~]# pgrep -l -a sshd    # 追加命令
119346 /usr/sbin/sshd -D
120226 sshd: root@pts/0    
120254 sshd: root@pts/1 
[root@oldboyedu ~]# pgrep -u root    # 以root用户运行

#查找指定终端的进程
[root@ubuntu ~]# pgrep -at pts/1
2785 -bash
2842 su - jose
2843 -bash -a:查看进程的运行命令 -l:查看进程名字 -u:指定用户
-t|--terminal <tty,...> #显示指定终端的进程

pidof

查看相关命令的进程

-x                     #按照脚本名称查找

[root@oldboyedu ~]# pidof sshd # 列出pid 120254 120226 119346 [root@oldboyedu ~]# pidof nginx|xargs -n 1 kill -9 # 通过pidof名直接杀掉进程, xargs -n竖着排序, 一行显示几个 [root@oldboyedu ~]# pidof nginx|xargs kill -9 # 通过pidof名直接杀掉进程

#按文件名查找
[root@ubuntu ~]# pidof -x ping.sh
8629
[root@ubuntu ~]# ps aux | grep 8629
root        8629  0.0  0.4 222528  3200 pts/1   S+   08:53   0:00 /bin/bash
./0528/ping.sh

5.top命令 (htop命令可以点击)

第一行内容:
        当前系统时间           服务器运行时间     有3个用户在登录        
top -     10:54:23             up 1 day, 17:56,  3 users,  
#平均负载(系统包含cpu和io)1分钟,5分钟,15分钟
load average: 0.00, 0.01, 0.05

第二行内容:
总共122个任务      1个正在运行(R)      121个进入睡眠状态的(S)    没有停止(T)    0个僵尸进程(Z)
Tasks: 122 total,   1 running,         121 sleeping,           0 stopped,       0 zombie

第三行内容:
        用户态   内核态     优先级     cpu空闲      等待进程占用cpu(wait)    硬中断(硬中断请求占cpu百分比)    软中断(软中断请求占cpu百分比)     虚拟机占用物理机CPU的百分比
%Cpu(s):  0.1 us,  0.1 sy,    0.0 ni,    99.8 id,            0.0 wa,          0.0 hi,                     0.0 si,                       0.0 st
用户态: 用户进程占cpu多少
linux上可以用的虚拟机软件: kvm,virtualbox
硬中断和软中断在企业中不用看这两个值

0.0 ni #资源有0.0%消耗在nice处理上
98.3 id #98.3%的cpu在空转

第四行:内存                     缓冲区
/缓存区 KiB Mem : 2028116 total, 150780 free, 144108 used, 1733228 buff/cache 第五行:swap虚拟内存 KiB Swap: 2097148 total, 2097148 free, 0 used. 1645080 avail Mem 第六行: 进程号 用户 优先级 虚拟内存 物理内存 共享内存 状态 占CPU的百分比 占内存的百分比 PID USER PR NI VIRT RES SHR S %CPU %MEM 运行时间 进程的运行命令 TIME+ COMMAND

st  #虚拟化占比

top命令使用

    -d:指定刷新时间    # top -d 1
    -p:指定pid    # top -p 122252 查看pid为122252的进程   top -p 122252,122253 查看2个pid进程
    -u:指定用户    # top -u root 查看用户为root的进程
    -b:保存到文件中    # top -d 1 -u postfix -b -n 2 > /tmp/top.txt 将2次显示的信息保存到top.txt
    -n:指定次数
    
    z:高亮显示        # 按一次高亮显示,再按一次退出高亮
    b:运行的进程,高亮显示
    1:  显示各个cpu使用情况    # 初始是显示所有cpu的平均情况
    s:修改刷新时间
    M:按照内存排序
    P:按照CPU排序
    R:倒叙
    f:自定义显示字段        # 然后按空格选择是够要显示该列, 按q退出
    q:退出
    k: 杀进程            # 输入pid, 输入信号9

 

中断

中断:硬中断
中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来影响设备的请求
硬中断执行过程中,无法再次接收硬中断请求处理


软中断:
事实上,为了解决中断处理程序执行过长的和丢失中断的问题,Linux将中断处理过程分成了两个阶段:
第一阶段:用来快速处理(硬中断)中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关工作
第二阶段:用来延迟处理第一阶段未完成的工作,通常以内核线程的方式运行。

 

杀手三人组

kill信号管理:

根据进程id

    1:重新加载    (不结束进程, 重新加载配置文件, nginx用的比较多,reload本质用的是1,这样加载过程中网站依然可以访问)
    2:类似于ctrl + c
    3:正常终止进程(让进程退出) # nginx等停止都是用该信号
    9:强制杀死(少用)(nginx主进程杀死,子进程还在变为僵尸进程)
    15:默认信号,进程终止    # kill 122529默认为信号15
    -------------------------------------
    18:重新唤起停止的进程    # kill -18 82083
    19:直接暂停        # kill -19 82083
    20:把进程放到后台并暂停

pkill

根据进程名  模糊杀手   只要包含该名称的进程都会被杀

    -t:指定终端(杀掉终端运行的命令)    (tty查终端名字,w查终端的号)  # pkill -t pts/2
    -9:强制,把终端运行的命令和终端一并杀掉    # pkill -9 -t pts/2

killall

根据进程名

    接进程的名字    # killall mysqld, killall sshd   (因为程序是后台守护进程的方式启动,所有名字后有d)

 

综合监控工具glances

CentOS 系统通过 epel 源安装,glances 可查看当前主机相关信息,也可运行于C/S模式查看远程主机信息

#安装
[root@ubuntu ~]# apt install glances

glances [OPTIONS]
#常用选项
-b #以Byte为单位显示网卡数据速率
-d #关闭磁盘I/O模块
-f file #设定输入文件位置
-o {HTML|CSV} #输出格式
-m #禁用mount模块
-n #禁用网络模块
-t N #延迟时间间隔
-1 #每个CPU的相关数据单独显示

#查看当前主机
[root@ubuntu ~]# glances

#glances 运行于C/S模式
#关闭防火墙
[root@rocky ~]# systemctl stop firewalld
#服务端配置 (-B写自己的IP地址)
[root@rocky ~]# glances -s -B 10.0.0.150 #指明监听在哪个IP上,默认端口为 tcp 61209

#客户端配置,连接监控
[root@ubuntu ~]#glances -c 10.0.0.150

 

查看进程打开文件 lsof

lsof:list open files,查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以 访问常规数据,还可以访问网络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等, 系统在后台都为该应用程序分配了一个文件描述符

格式:
lsof [options...] [names] 

#常用选项       
-c cmd #列出指定进程所打开的文件
-g #列出GID号进程详情
+d dir #列出目录下被打开的文件
+D dir #递归列出目录下被打开的文件
-n dir #列出使用NFS的文件
-i condition #列出符合条件的进程
-p pid #列出指定进程号所打开的文件
-u #列出UID号进程详情
-n #不反向解析网络名字

例:
#列出所有打开文件
[root@ubuntu ~]# lsof | head
#查看当前哪个进程正在使用此文件

[root@ubuntu ~]# lsof /var/log/messages
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME

#查看指定终端启动的进程
[root@ubuntu ~]# lsof /dev/pts/1
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    2543 root   0u   CHR  136,1     0t0    4 /dev/pts/1
bash    2543 root   1u   CHR  136,1     0t0    4 /dev/pts/1
bash    2543 root   2u   CHR  136,1     0t0    4 /dev/pts/1
bash    2543 root 255u   CHR  136,1     0t0    4 /dev/pts/1

[root@ubuntu ~]# lsof `tty`

#查看指定进程打开的文件
[root@ubuntu ~]# lsof -p 1270
#查看指定程序打开的文件
[root@ubuntu ~]# lsof -c httpd
#查看指定用户打开的文件
[root@ubuntu ~]# lsof -u root | more

#查看所有网络连接,通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例
如:sshd等。也可以通过指定ip查看该ip的网络连接情况
[root@ubuntu ~]# lsof -i –n      
[root@ubuntu ~]# lsof -i@127.0.0.1

#查看端口连接情况,通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
[root@ubuntu ~]# lsof -i :80 -n
#查看指定进程打开的网络连接,参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程
[root@ubuntu ~]# lsof -i –n -a -p 9527
#查看指定状态的网络连接,-n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状
态通过多个参数可以清晰的查看网络连接情况、协议连接情况等 [root@ubuntu ~]# lsof -n -P -i TCP -s TCP:ESTABLISHED

 

从内存中恢复己删除的文件

#打开文件
[root@ubuntu ~]# tail -f /var/log/syslog 
#删除文件 [root@ubuntu ~]# rm -rf /var/log/syslog [root@ubuntu ~]# ls /var/log/syslog ls: cannot access '/var/log/syslog': No such file or directory
#找出进程 [root@ubuntu ~]# ps aux | grep tail root 6037 0.0 0.1 217128 976 pts/4 S+ 02:29 0:00 tail -f /var/log/syslog
#查看内存映射 [root@ubuntu ~]# ll /proc/6037/fd/ total 0 lrwx------ 1 root root 64 May 29 02:32 0 -> /dev/pts/4 lrwx------ 1 root root 64 May 29 02:32 1 -> /dev/pts/4 lrwx------ 1 root root 64 May 29 02:32 2 -> /dev/pts/4 lr-x------ 1 root root 64 May 29 02:32 3 -> '/var/log/syslog (deleted)' lr-x------ 1 root root 64 May 29 02:32 4 -> anon_inode:inotify
#打开,文件内容还在 [root@ubuntu ~]# cat /proc/6037/fd/3
#恢复 [root@ubuntu ~]# cat /proc/6037/fd/3 > /var/log/syslog [root@ubuntu ~]# ll /var/log/syslog -rw-r--r-- 1 root root 1885719 May 29 02:38 /var/log/syslog

 

CentOS 8 新特性 cockpit

由cockpit包提供,当前Ubuntu和CentOS7也支持此工具

Cockpit 是CentOS 8 取入的新特性,是一个基于 Web 界面的应用,它提供了对系统的图形化管理

  • 监控系统活动(CPU、内存、磁盘 IO 和网络流量)
  • 查看系统日志条目
  • 查看磁盘分区的容量
  • 查看网络活动(发送和接收)
  • 查看用户帐户
  • 检查系统服务的状态
  • 提取已安装应用的信息
  • 查看和安装可用更新(如果以 root 身份登录)并在需要时重新启动系统
  • 打开并使用终端窗口
#安装,启动
[root@localhost ~]# yum install -y cockpit
[root@localhost ~]# systemctl enable --now cockpit.socket
Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → 
/usr/lib/systemd/system/cockpit.socket.

#访问
http://10.0.0.150:9090

#如果cockpit提示浏览器太老
执行“sed 's/selector(:is():where())/selector(:is(*):where(*))/' -i.bak /usr/share/cockpit/static/login.js”命令修改cockpit文件。

关闭浏览器重启,即可进入

 

posted @ 2023-05-16 17:45  战斗小人  阅读(201)  评论(0编辑  收藏  举报