wowoqu 发表于 2025-2-7 02:32:49

Linux系统进程

系统进程

【1】、进程基本概述

当我们运行一个程序,那么我们将运行的程序叫进程
​       PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限
​       PS2:在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息
程序和进程的区别
​       程序是数据和指令的集合,是一个静态的概念,比如/bin/ls /bin/cp 等二进制文件,同时程序可以长期存在系统中
​       进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中
程序的生命周期
​                一个对象从无到有、从有到无过程称为生命周期

当父进程接收到任务调度时,会通过fock派生子进程来处理,子进程会继承父进程衣钵(相当于完全复制了一份父进程的信息)

[*]子进程在处理任务代码时,父进程会进入等待状态中,在一个进程中一般都是子进程去干活
[*]子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源
[*]如果子进程在处理任务过程中,父进程退出,子进程没有退出,子进程没有被父进程管理,则变为僵尸进程
[*]每个进程都有自己的PID号,子进程称为PPID
祖先进程

[*]pid=1的进程
[*]在系统启动时,会首先启动一个祖先进程,在启动别的进程
root@xu-ubuntu:~/scripts# pstree -psystemd(1)─┬─ModemManager(935)─┬─{ModemManager}(960)# pstree -p systemd(1)─┬─NetworkManager(874)─┬─{NetworkManager}(882)【2】、监控进程状态

程序在运行后,我们需要了解进程的运行状态,查看进程的状态分为:静态和动态两种方式
1、ps命令

使用ps命令查看当前的进程状态(静态)
ps –auxf常用组合方式查看进程、PID、占用cpu百分比,占用内存百分比,状态、执行的命令等

[*]-a 显示所有终端机下执行的进程,除了阶段作业领导者之外
[*]-u 以用户为主的格式来显示进程状况
[*]-x 显示所有进程,不以终端机来区分
[*]-f 用ASCII字符显示树状结构,表达进程间的相互关系

标志意义USER该 process 属于那个使用者账号的PID该 process 的号码%CPU该 process 使用掉的 CPU 资源百分比%MEM该 process 所占用的物理内存百分比VSZ该 process 使用掉的虚拟内存量 (Kbytes)RSS该 process 占用的固定的内存量 (Kbytes)TTY该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。STAT该程序目前的状态START该 process 被触发启动的时间TIME该 process 实际使用 CPU 运作的时间COMMAND该程序的实际指令[]内核态进程 无[] 用户进程STAT基本状态描述STAT状态+符号描述R进程运行s进程是控制进程, Ss进程的领导者,父进程S可中断睡眠<进程运行在高优先级上,S<优先级较高的进程T进程被暂停N进程运行在低优先级上,SN优先级较低的进程D不可中断睡眠+当前进程运行在前台,R+该表示进程在前台运行Z僵尸进程l进程是多线程的,Sl表示进程是以线程方式运行案例1:1)在终端1上运行vimvim test2)在终端2上运行ps命令查看状态# ps aux | grep vimroot      4343140.20.3 2272726960 pts/1    S+   18:27   0:00 vim test.txt3)在终端1上挂起vim命令按下: ctrl+z4) 回到终端2再次运行ps命令查看状态# ps aux | grep vimroot      4343140.00.3 2272726960 pts/1    T    18:27   0:00 vim test.txt案例2PS命令查看不可中断状态进程使用tar打包文件时,可以通过中断不断查看状态,由S+,R+变为D+# ps axu|grep tar|grep -v greproot   142892.60.1 1242681888 pts/2    S+   10:56   0:01 tar zcf etc.tar.gz /etc/ /usr/ /var# ps axu|grep tar|grep -v greproot   142892.70.2 1243802240 pts/2    R+   10:56   0:01 tar zcf etc.tar.gz /etc/ /usr/ /var # ps axu|grep tar|grep -v greproot   142892.90.2 1249162724 pts/2    D+   10:56   0:01 tar zcf etc.tar.gz /etc/ /usr/ /var2、top命令

使用top命令查看当前的进程状态 动态
任务含义Tasks:73 total当前进程的总数2 running正在运行的进程数71 sleeping睡眠的进程数0 stopped停止的进程数0 zombie僵尸进程数%Cpu(s):49.2 us系统用户进程使用CPU百分比5.7 sy内核进程占用CPU百分比,内核是于硬件进行交互ni调整过优先级进程占用百分比45.2 id空闲CPU的百分比0.0 waCPU等待IO完成的时间0.0 hi硬中断,占的CPU百分比0.0 si软中断,占的CPU百分比0.0 st比如虚拟机占用物理CPU的时间什么是中断?
中断就是终止当前在做的事情 去执行另一段程序
会保留现场,执行的那段程序做完之后会在回来执行刚来尚未完成的部分

软中断和硬中断的区别
软中断硬中断是否有随机性 突发性否是是否有中断响应周期无是中断类型号的提供方法固定或由指令提供由中断控制器提供,硬件提供【3】、管理进程状态

当程序运行为进程后,如果希望停止进程,怎么办呢?那么此时我们可以使用linux的kill命令对进程发送关闭新号,当然除了kill 还有killall pkill
使用kill –l列出当前系统所支持的信号

虽然Linux信号很多,但是我们仅仅使用最常用的3个信号
1) SIGHUP 重新加载配置文件                                                 1    不停机维护
2) SIGKILL 强制杀死进程                                                 9    不管内存中是否有没有数据,直接杀进程,可能会丢文件,类似拔电源
3) SIGTERM 终止进程,默认kill使用该信号      15如果内存中还有和当前进程相关的信息,将内存中的信息写入磁盘后,在杀死进程
# ps -ef | grep httpdroot      272889       10 06:45 ?      00:00:03 /usr/sbin/httpd -DFOREGROUNDapache    2729722728890 06:45 ?      00:00:00 /usr/sbin/httpd -DFOREGROUNDapache    2729732728890 06:45 ?      00:00:11 /usr/sbin/httpd -DFOREGROUNDapache    2729742728890 06:45 ?      00:00:12 /usr/sbin/httpd -DFOREGROUNDapache    2729752728890 06:45 ?      00:00:11 /usr/sbin/httpd -DFOREGROUND# kill -9 272889# ps aux | grep httpd# 修改httpd端口,使用kill -1 重新加载,不停机维护root@kylin-xu ~]# ss -tunlp | grep httpdtcp   LISTEN   0      128                  *:80                  *:*       users:(("httpd",pid=470759,fd=4),("httpd",pid=470758,fd=4),("httpd",pid=470757,fd=4),("httpd",pid=470213,fd=4))vim /etc/httpd/conf/httpd.conf # kill -1 470213# ss -tunlp | grep httpdtcp   LISTEN   0      128                  *:8080                *:*       users:(("httpd",pid=471610,fd=9),("httpd",pid=471609,fd=9),("httpd",pid=471608,fd=9),("httpd",pid=470213,fd=9))killall命令
# 可以根据进程名字杀死进程# killall httpd# ps -ef | grep httpdroot      4742404309100 19:41 pts/1    00:00:00 grep httpdpkill命令
    使用pkill踢出从远程登录到本机的用户,终止pts1上所有进程,用户强制退出# pkill -9 -t pts/1【4】、后台进程

1、临时后台进程

1) 什么是后台进程
​                运行的进程默认在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行
2) 如何把程序放在后台
# 把进程放入后台运行 使用 &# sleep 5000 & 480069# ps aux | grep sleeproot      4800690.00.0 212380   760 pts/1    S    19:54   0:00 sleep 5000root      4801510.00.0 213156   892 pts/1    R+   19:54   0:00 grep sleep# jobs查看后台进程# jobs+运行中               sleep 5000 &# 调回前台执行# fg %1sleep 5000# ctrl + c 终止# CTRL + z 后台停止,bg 进程在后台执行# sleep 5000 ^Z+已停止               sleep 5000# bg %1+ sleep 5000 &放入后台的进程,如果再终端断开连接后 ,重新连上进程会消失,我们现在不想让他消失
2、持久化后台进程

screen的使用 常用
screen的原理:开辟一个新的bash space ,将进程放入新的 bash space 中,
yum install -y screen# 开创新的 bash ---- -Sbash空间名称# screen -S wget_install# 进入了screen 开辟的新的bash,在新的bash中执行命令,就相当于在后台执行命令了# sh 1.sh # ctrl +a+d 表示退出当前bash空间,放入后台,会到前台# ps aux | grep wgetroot      4915860.00.1 2282402360 ?      Ss   20:27   0:00 SCREEN -S wget_installroot      4916331.00.6 227348 12832 pts/1    S+   20:27   0:01 wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm --no-check-certificate# 通过screen创建的后台进程在断开终端后也会正常执行ctrl + d,重连终端,进程依旧存在# ps aux | grep wgetroot      4915860.00.1 2282402360 ?      Ss   20:27   0:00 SCREEN -S wget_install--list:查看当前有哪些bash空间# screen -listThere is a screen on:      491586.wget_install   (Detached)1 Socket in /run/screen/S-root.-r:进入指定的bash space        ,可以通过进程号或bash space name# screen -r491586nohup
# nohup sleep 300 & 494330【5】、进程优先级

1) 在启动进程时,为不同的进程使用不同的调度策略

[*]nice 值越高 表示优先级越低,例如+19 该进程容易将CPU使用量让给其他进程
[*]nice值越低 表示优先级越高,例如-20, 改进程更不倾向于让出CPU
使用top或ps敏玲查看进程的优先级
使用top可以查看nice优先级 NI:实际nice级别,默认是0 动态修正CPU调度。范围(-20~19)。越大,cpu调度越一般,越小,cpu调度越偏向它。一般用于后台进程,调整也是往大了调,用来给前台进程让出CPU资源
PR: 优先级 显示nice值,PR默认是20,越小,优先级越高。修改nice可以同时修改PR-20映射到0, +19映射到39

nice指定程序的优先级,语法格式nice-n 优先级数字 进程名称
页: [1]
查看完整版本: Linux系统进程