首页 > 系统相关 >Linux进程管理

Linux进程管理

时间:2024-01-13 17:32:33浏览次数:34  
标签:tmp httpd 管理 vim node1 Linux 进程 root

一、什么是进程

进程是加载到内存中的一段指令。如果某个用户运行一个程序,那么这个程序产生的进程也会继承到这个用户的UID和GID以及SELINUX的上下文,并且进程还具有父子关系,一个父进程可以有多个子进程

二、查看进程

2.1 ps查看进程信息

用法

作用

ps

查看当前终端的进程

ps -a

查看所有终端的进程

ps -au

查看所有终端的进程并显示用户、cpu和内存使用率等信息

ps -ax

查看所有的进程包括没有终端的进程

ps -aux

查看所有进程的详细信息(常用)

ps -ef

查看所有进程的详细信息(常用)

ps -axo user,pid,%cpu,stat,command

按照指定的格式“user,pid,%cpu,stat,command”输出

ps -aux --sort=%cpu

查看所有进程的详细信息,按照cpu使用率从小到大排序

ps -aux --sort=-%cpu

查看所有进程的详细信息,按照cpu使用率从大到小排序

ps -aux --sort=%mem

查看所有进程的详细信息,按照内存使用率从小到大排序

ps -aux --sort=-%mem

查看所有进程的详细信息,按照内存使用率从大到小排序

2.2 ps -aux执行结果说明

Linux进程管理_nice值

TTY:表示的是终端,如果进程的这一栏显示的是:

  • pts:是虚拟伪终端(一般ssh登录以及图形化
  • tty2:表示当前有桌面环境
  • ?:表示该进程没有终端,一般是内核进程

STAT:进阶状态补充

  • D 不可中断睡眠(通常是在IO操作)收到信号不唤醒和不可运行,进程必须等待直到有中断发生
  • R 正在运行或可运行(在运行队列排队中)
  • S 可中断睡眠(休眠中,受阻,在等待某个条件的形成或接受到信号)
  • T 已停止的进程收到SIGSTOP, SIGSTP, SIGTIN, SIGT0瞧号后停止运行
  • W 正在换页(2.6.内核之前有效)
  • X 死进程(未开启)
  • Z 僵尸进程 进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放BSD风格的
  • < 高优先级(not nice to other users)
  • N 低优先级(nice to other users)
  • L 页面锁定在内存(实时和定制的IO)
  • s 一个信息头
  • | 多线程(使用CLONE_THREAD,像NPTL的pthreads的那样)
  • + 在前台进程组

2.3 top查看进程信息

常用选项

作用

-a

按内存使用情况排序

-d

设置显示的刷新速度(默认为3秒)

-n

设置显示的总次数,完成后自动退出

-p

仅显示指定进程ID

-u

仅显示指定用户运行的进程

2.3.1 top执行结果说明

第一行:

Linux进程管理_nice值_02

执行uptime命令可以得到与top命令第一行一样的结果

[root@node1 ~]# uptime
 12:40:00 up  1:17,  2 users,  load average: 0.02, 0.02, 0.00

第二行:

Linux进程管理_kill_03


第三行:

Linux进程管理_进程_04


第四行:

Linux进程管理_top_05

第五行:

Linux进程管理_top_06

进程信息:

进程信息:

在top命令中按F键可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带*号的是默认列。

  • PID = (Process Id) 进程Id;
  • USER = (User Name) 进程所有者的用户名;
  • PR = (Priority) 优先级
  • NI = (Nice value) nice值。负值表示高优先级,正值表示低优先级
  • VIRT = (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  • RES = (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
  • SHR = (Shared Mem size (kb)) 共享内存大小,单位kb
  • S = (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
  • %CPU = (CPU usage) 上次更新到现在的CPU时间占用百分比
  • %MEM = (Memory usage (RES)) 进程使用的物理内存百分比
  • TIME+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒  
  • PPID = (Parent Process Pid) 父进程Id  
  • RUSER = (Real user name)  
  • UID = (User Id) 进程所有者的用户id  
  • GROUP = (Group Name) 进程所有者的组名  
  • TTY = (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ?  
  • P = (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义  
  • SWAP = (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb  
  • TIME = (CPU Time) 进程使用的CPU时间总计,单位秒  
  • CODE = (Code size (kb)) 可执行代码占用的物理内存大小,单位kb  
  • DATA = (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb  
  • nFLT = (Page Fault count) 页面错误次数  
  • nDRT = (Dirty Pages count) 最后一次写入到现在,被修改过的页面数  
  • WCHAN = (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名  
  • Flags = (Task Flags <sched.h>) 任务标志,参考 sched.h
  • COMMAND = (Command name/line) 命令名/命令行

top命令执行过程中还可以使用的一些交互命令,例如:

  • 数字1:监控每个逻辑CPU的状况
  • c:切换显示命令名称和完整命令行
  • M:可按内存占用情况进行排序
  • P:根据CPU使用百分比大小进行排序
  • T:根据时间/累积时间进行排序
  • F:选择显示的内容

2.4 pgrep与pidof

pgreppidof都是通过进程名称查找进程id的命令,两者的区别在于:pgrep只要进程的名称里面含有查找的关键字就会把它列出来,属于模糊查询,而pidof必须要进程的名称与查找的关键字完全一致才会列出pid,属于精确查询,下面是pgrep命令的常用选项:

pgrep命令常用选项

选项

作用

-U

查找某个用户的进程id

-G

查找某个组的进程id

-P

根据父进程id,查找出所有子进程id

-I

不仅打印pid,也打印进程名

-o


表示如果该程序有多个进程正在运行,则仅查找最老的,即最先启动的(多个进程时即父进程PID)

-n

表示如果该程序有多个进程正在运行,则仅查找最新的,即最后启动的

-d

定义多个进程之间的分隔符,如果不定义则使用换行符

三、僵尸(zombie)进程与孤儿进程

僵尸进程:

Linux进程管理_进程_07

如上图所示,操作系统下父进程在运行时产生了一个子进程,用于执行某些任务,执行完成以后需要把结果汇报给父进程,再由父进程结束子进程, 然而子进程在汇报结果时父进程因为某些原因卡住了,由于子进程没有收到父进程的响应,子进程就不断地重复这一步骤,这种情况下,这个子进程就成为了一个僵尸进程,僵尸进程对系统是有危害的,大量消耗系统的CPU和内存资源,需要人为的手动结束进程

孤儿进程:

Linux进程管理_进程_08

Linux进程管理_ps_09

如上两张图所示,操作系统下父进程在运行时产生了一个子进程,父进程结束了,而它的一个或多个子进程还在运行,那么这些子进程就成为孤儿进程(father died)。孤儿进程会被PID为1的进程自动接管,RHEL 7以前是init,RHEL 7以后是systemd,由PID为1的进程来结束孤儿进程。

四、结束进程

在Linux中进程通信的方式有:信号、套接字、有名管道、消息队列、共享内存等等...

其中最常见的通信方式有信号和套接字,以套接字(sock)为例,例如在Zabbix 4.0中,Zabbix-server服务端访问Mariadb数据库方式就是通过sock文件访问的,不一定是通过开放网络端口,这是基于数据安全考虑的一种做法

Linux进程管理_kill_10


在Linux中默认使用信号来进行进程的通信,每个进程在收到信号之前,都是先运行自己的代码,收到信号以后,优先处理信号

Linux进程管理_ps_11

4.1 kill命令给进程发送信号

在Linux中kill命令常用于结束进程,其实严格意义上来讲它是一个手动给进程发送信号的工具

通过kill -l命令,可以查看到kill命令可以给进程发送64种信号

Linux进程管理_kill_12

其中最常用的信号有三个,分别是“-1”、“-15”和“-9

信号

作用

-1

Signal 1: HUP - 重读配置文件

-15

Signal 15: TERM - 结束进程(默认)

-9

Signal 9: KILL - 强制结束进程(生产环境慎用,很有可能造成数据丢失)

其实我们在CLI命令行窗口执行命令的时候经常使用的快捷键“Ctrl + C”也是一个给进程发送Signal 15的途径

4.2 killall命令

killall命令与kill命令一样,都可以用于结束进程 ,不同之处在于:killall可以批量结束一类进程(根据名字结束进程)

示例:

使用vim编辑器同时编辑三个文件

[root@node1 ~]# vim 111.txt
[root@node1 ~]# vim 222.txt
[root@node1 ~]# vim 333.txt

查看vim相关进程

[root@node1 ~]# pgrep -l vim
5201 vim
5202 vim
5203 vim

批量结束vim进程

[root@node1 ~]# killall vim
[root@node1 ~]# pgrep -l vim
[root@node1 ~]# 

4.3 pkill结束终端进程

pkill命令用于结束一个终端(通常是ssh的pts)的进程,使用-t选项,后面接的是终端名称

示例:

首先,使用ssh方式登录一个用户

Linux进程管理_ps_13

然后,在本机的命令行终端结束这个ssh终端进程

Linux进程管理_nice值_14

ssh连接断开

Linux进程管理_nice值_15

需要注意的是:在ssh远程用户的终端中,是不能结束这个终端本身的进程的

Linux进程管理_ps_16

但是,在Linux本机的终端中,用户可以结束自己当前所使用的终端

Linux进程管理_kill_17

Linux进程管理_kill_18

五、调整进程的静态优先级(NICE)

调整进行的优先级,在系统繁忙时能够保证优先级高的进程的被分配到CPU资源

PR:动态优先级,由内核负责调整

NI:静态优先级,由用户负责调整

nice 值取值范围:(-20 - 19),nice值越低,优先级越高

nice值只有root可以降低(root才可以调整进程的优先级)

示例:

Case1:在进程启动时指定优先级

[root@node1 ~]# nice -n -20 vim manual.txt
[root@node1 ~]# ps -axo user,pid,ppid,nice,command | grep vim
root        6498    6439 -20 vim manual.txt
root        6500    6211   0 grep --color=auto vim

Case2:调整正在运行的进程优先级

[root@node1 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2024-01-13 15:58:58 CST; 45s ago
     Docs: man:httpd.service(8)
 Main PID: 6570 (httpd)
   Status: "Running, listening on: port 80"
    Tasks: 213 (limit: 24436)
   Memory: 33.7M
   CGroup: /system.slice/httpd.service
           ├─6570 /usr/sbin/httpd -DFOREGROUND
           ├─6571 /usr/sbin/httpd -DFOREGROUND
           ├─6572 /usr/sbin/httpd -DFOREGROUND
           ├─6573 /usr/sbin/httpd -DFOREGROUND
           └─6574 /usr/sbin/httpd -DFOREGROUND

Jan 13 15:58:57 node1.example.com systemd[1]: Starting The Apache HTTP Server...
Jan 13 15:58:58 node1.example.com httpd[6570]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using node1.example.com. Set the 'ServerName' directive globally to suppress this message
Jan 13 15:58:58 node1.example.com systemd[1]: Started The Apache HTTP Server.
Jan 13 15:58:58 node1.example.com httpd[6570]: Server configured, listening on: port 80
[root@node1 ~]# 
[root@node1 ~]# renice -n -10 -p 6570
6570 (process ID) old priority 0, new priority -10
[root@node1 ~]# ps -axo user,pid,ppid,nice,command | grep httpd
root        6570       1 -10 /usr/sbin/httpd -DFOREGROUND
apache      6571    6570   0 /usr/sbin/httpd -DFOREGROUND
apache      6572    6570   0 /usr/sbin/httpd -DFOREGROUND
apache      6573    6570   0 /usr/sbin/httpd -DFOREGROUND
apache      6574    6570   0 /usr/sbin/httpd -DFOREGROUND
root        6809    6211   0 grep --color=auto httpd

六、作业控制(job control)

  • 在后台运行一个进程:
    给命令的最后附加一个&符号
  • 临时停止一个正在运行的进程:
    使用快捷键Ctrl + Z或者发送signal 19(停止)
  • 管理后台或者挂起的作业
    显示作业号和名字:jobs
    在后台恢复:bg [%jobnum]
    在前台恢复:fg [%jobnum]
    发送一个信号:kill [-SIGNAL] [%jobnum]

示例:

Case1:在后台运行一个进程

[root@node1 ~]# wget https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso &
[1] 7135
[root@node1 ~]# 
Redirecting output to ‘wget-log’.		# wget自动重定向输出到文件“wget-log”

[root@node1 ~]# jobs	# 显示作业号和名字
[1]+  Running                 wget https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso &
[root@node1 ~]# 
[root@node1 ~]# tail -f wget-log 		# 实时查看“wget-log”日志
--2024-01-13 16:23:13--  https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 218.104.71.170, 2001:da8:d800:95::110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|218.104.71.170|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2516582400 (2.3G) [application/octet-stream]
Saving to: ‘Rocky-8-latest-x86_64-minimal.iso’

Rocky-8-latest-x86_64-minimal.iso                              59%[=====================================================================================>                                                            ]   1.39G  32.6MB/s    eta 31s    ^C
[root@node1 ~]# 
[root@node1 ~]# 
[root@node1 ~]# jobs	# 显示作业号和名字
[1]+  Done                    wget https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso
[root@node1 ~]# 
[root@node1 ~]# ls -l Rocky-8-latest-x86_64-minimal.iso 
-rw-r--r--. 1 root root 2516582400 Nov 22 03:05 Rocky-8-latest-x86_64-minimal.iso
[root@node1 ~]# 
[root@node1 ~]# cat wget-log 
--2024-01-13 16:23:13--  https://mirrors.ustc.edu.cn/rocky/8.9/isos/x86_64/Rocky-8-latest-x86_64-minimal.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 218.104.71.170, 2001:da8:d800:95::110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|218.104.71.170|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2516582400 (2.3G) [application/octet-stream]
Saving to: ‘Rocky-8-latest-x86_64-minimal.iso’

Rocky-8-latest-x86_64-minimal.iso                             100%[=================================================================================================================================================>]   2.34G  34.5MB/s    in 74s     

2024-01-13 16:24:27 (32.5 MB/s) - ‘Rocky-8-latest-x86_64-minimal.iso’ saved [2516582400/2516582400]

[root@node1 ~]# 

Case2:临时停止一个正在运行的进程

[root@node1 ~]# vim README
======================
按快捷键“Ctrl + Z”
======================
[1]+  Stopped                 vim README
[root@node1 ~]# 
[root@node1 ~]# ps -aux | grep vim
root        7247  0.0  0.2 245844  8460 pts/1    T    16:34   0:00 vim README
root        7270  0.0  0.0 221940  1112 pts/0    S+   16:36   0:00 grep --color=auto vim
[root@node1 ~]# 
[root@node1 ~]# jobs	# 显示作业号和名字
[1]+  Stopped                 vim README
[root@node1 ~]# bg %1		# 后台恢复
[1]+ vim README &
[root@node1 ~]#

[1]+  Stopped                 vim README	# vim程序无法后台运行,在后台运行的一瞬间立刻暂停
[root@node1 ~]# jobs
[1]+  Stopped                 vim README
[root@node1 ~]# fg %1		# 恢复到前台运行
vim README							# 进入vim编辑视图
======================
另外打开一个命令行窗口
======================
[root@node1 ~]# ps -aux | grep vim
root        7247  0.0  0.2 245844  8536 pts/1    S+   16:34   0:00 vim README
root        7298  0.0  0.0 221940  1108 pts/0    S+   16:39   0:00 grep --color=auto vim
[root@node1 ~]# 
[root@node1 ~]# kill -19 7247		# 通过kill发送信号暂停进程
[root@node1 ~]# 
======================
回到vim编辑的窗口
======================                         
 
[1]+  Stopped                 vim README                                                                                                                                                                                                                
[root@node1 ~]# jobs
[1]+  Stopped                 vim README                                                                                                                                                                                                                
[root@node1 ~]# fg %1		# 恢复到前台运行                                                                                                                                                                                                                                  
vim README							# 进入vim编辑视图

Case3:后台运行一个进程,重定向输出

[root@node1 ~]# tar -zcvf /tmp/tmp.tgz /tmp 2&> log.txt &
[1] 7409
[root@node1 ~]# 
[1]+  Exit 2                  tar -zcvf /tmp/tmp.tgz /tmp 2 &> log.txt
[root@node1 ~]# 
[root@node1 ~]# cat log.txt 
tar: Removing leading `/' from member names
/tmp/
/tmp/ks-script-qa4dbytl
tar: Removing leading `/' from hard link targets
/tmp/ks-script-9mv4xu64
=======================================
以下省略
=======================================
[root@node1 ~]# ls -lh /tmp/tmp.tgz 
-rw-r--r--. 1 root root 2.1K Jan 13 16:51 /tmp/tmp.tgz
[root@node1 ~]# tar -tf /tmp/tmp.tgz 	# 查看压缩包内的文件名
tmp/
tmp/ks-script-qa4dbytl
tmp/ks-script-9mv4xu64
tmp/.X11-unix/
tmp/.ICE-unix/
tmp/.XIM-unix/
=======================================
以下省略
=======================================

参阅

鳥哥私房菜 - 第十六章、程序管理與 SELinux 初探

Linux 系统管理 : top 命令详解_linux top-CSDN博客

标签:tmp,httpd,管理,vim,node1,Linux,进程,root
From: https://blog.51cto.com/min2000/9232755

相关文章

  • Controller(StatefulSet)-部署有状态应用,部署守护进程,一次任务和定时任务
    Controller(StatefulSet)-部署有状态应用在Kubernetes中,StatefulSet是一种用于部署有状态应用的控制器。与无状态应用不同,有状态应用需要保持持久性和可识别的网络标识。在有状态应用中,每个Pod都有一个唯一的标识符,并且Pod的创建和删除顺序是有序的。在StatefulSet中创建的Pod具有以......
  • Linux进程间通信 [补档-2023-07-27]
    Linux进程间通信10-1简介​在Linux下,进程之间相互独立,每个进程都有自己不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问。如果非要交换数据则必须通过内核,在内核中开辟一块缓冲区。假设有两个进程AB,他们之间想......
  • Linux的信号管理 [补档-2023-07-30]
    信号11-1简介:​信号只是表示某个信号,不可以携带大量信息,信号需要满足特点的条件才会产生。是一种特别的通信手段。11-2信号机制:​假设有两个进程A,B,现在进程A给进程B发送信号,进程B在收到信号之前会执行自己的代码,当收到信号后,无论执行到了哪里,都要暂停执......
  • Linux文件IO之二 [补档-2023-07-21]
    8-5linux系统IO函数:open函数:​函数原型:intopen(constchar*pathname,intflags,mode_tmode);​功能:打开一个文件并返回文件描述符。与c库中的fopen差不多​参数:pathname:要打开的文件路径名。flags:打开文件的标志O_RDONLY(只读)O_WRONLY(只写)O_RD......
  • Linux的进程管理 [补档-2023-07-25]
    Linux进程管理9-1并发与并行:​并发:在同一个cpu上,并且在一个时间段时,同时运行多个程序。比如在1000毫秒内,我们有5个程序需要执行,所以我们可以将1000毫秒分为5个200毫秒,让每个程序都占用200毫秒的cpu使用权,这样在1000毫秒内就可以执行5个程序。​并行:大于等......
  • GDB调试之源代码查看与管理(六)
    一、源代码管理命令显示源代码:listorl,默认显示10行(在当前行往后5行,以及往前5行,总共10行代码)设置每次显示的行数:setlistsizexx查看指定函数代码:listtest_fun查看指定文件指定行代码:listmain.cpp:15显示源代码:查看指定函数代码:查看指定文件指定行代码:设置每次......
  • Linux文件IO之一 [补偿-2023-07-21]
    Linux文件IO8-1C标准库IO函数的工作流程​使用fopen函数打开一个文件,之后会返回一个FILE*fp指针,fp指针指向一个结构体,这个结构体是c标准io库中的一个结构体,这个结构体有三个重要的成员:文件描述符:描述符指向一个打开文件表,通过此表可以找到文件的inode表,通过对应的in......
  • Linux下的gcc/g++编译器的使用 [补档-2023-06-13]
    gcc编译器​这东西是Linux上的c/c++编译器。5-1gcc的工作流程5-2gcc的常用参数-v查看gcc版本号,--version也可以-E生成预处理文件-S生成汇编文件-c只编译,生成.o文件,通常称为目标文件-I指定头文件所在的路径-L指定库文件所在的路径-l指定库的名......
  • Linux系统的一些实用操作 [补档-2023-07-30]
    Linux的实用操作4-1.常用快捷键强制停止:当某些程序运行时,或者命令输入错误时,可以通过ctrl+c来强制结束当前的操作。退出或登出:当我们要退出某些用户时,或者要退出某些特殊的页面可以使用ctrl+d来进行。(vi/vim不可用)历史命令搜索:通过输入history命令来查看之前输入......
  • Linux的用户和权限 [补档-2023-07-07]
    Linux用户和权限3-1.su用户切换命令exit用户退出命令​用户切换命令的语法:​su[-][用户名]​其中:​-可选,表示是否在切换用户后加载环境变量,建议带上。​用户名可选,表示要切换到那个用户,如果不填则默认切换到root用户上。​......