什么是进程?

进程是程序的一次执行过程,也是操作系统分配和保护资源的基本单位。进程有不同的状态,比如运行态、就绪态、阻塞态等,它们之间可以相互转换。进程还有一个进程控制块(PCB),用来记录和描述进程的信息,比如进程 ID、用户 ID、CPU 寄存器值等。

进程与程序的区别

在操作系统中进行的所有操作都是通过运行相应的程序来实现的,我们可以在系统中安装很多应用程序。这些程序平时都存储在硬盘中。当要运行某个程序时,就要将其从硬盘调入内存中,以供CPU进行运算和处理。这些系统中正在运行的程序被称为进程,是系统正在执行的任务。

程序只占用磁盘空间,不占用系统运行资源。进程由程序产生,要占用CPU和内存等系统资源,当关闭进程之后,它所占用的资源也随之释放。

  • 例如,用户打开一个文件,就会产生一个打开文件的进程,关闭文件,进程也随之关闭。
  • 另外,并非每个程序只能对应一个进程,有的程序启动后可以创建一个或多个进程。

Linux进程状态

  • 就绪状态(ready)
  • 执行状态(Running)
  • 阻塞状态(Blocked)

三种状态切换转换:

就绪 --> 执行

处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。

执行 -->就绪

处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。

执行 -->阻塞

正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。

阻塞 --> 就绪

处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

Linux Process

Linux进程相关命令

PS 报告当前系统的进程状态


ps axo pid,comm,pcpu # 查看进程的PID、名称以及CPU 占用率
ps aux | sort -rnk 4 # 按内存资源的使用量对进程进行排序
ps aux | sort -nk 3  # 按 CPU 资源的使用量对进程进行排序
ps -A # 显示所有进程信息
ps -u root # 显示指定用户信息
ps -efL # 查看线程数
ps -e -o "%C : %p :%z : %a"|sort -k5 -nr # 查看进程并按内存使用大小排列
ps -ef # 显示所有进程信息,连同命令行
ps -ef | grep ssh # ps 与grep 常用组合用法,查找特定进程
ps -C nginx # 通过名字或命令搜索进程
ps aux --sort=-pcpu,+pmem # CPU或者内存进行排序,-降序,+升序
ps -f --forest -C nginx # 用树的风格显示进程的层次关系
ps -o pid,uname,comm -C nginx # 显示一个父进程的子进程
ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm # 重定义标签
ps -e -o pid,comm,etime # 显示进程运行的时间
ps -aux | grep named # 查看named进程详细信息
ps -o command -p 91730 | sed -n 2p # 通过进程id获取服务名称

将目前属于您自己这次登入的 PID 与相关信息列示出来


ps -l
# UID   PID PPID       F CPU PRI NI       SZ   RSS WCHAN     S             ADDR TTY           TIME CMD
# 501   566   559     4006   0 31 0 4317620   228 -     Ss                 0 ttys001   0:00.05 /App...cOS/iTerm2 --server /usr/bin/login -fpl kenny /Ap...s/MacOS/iTerm2 --launch_shel
# 501   592   577     4006   0 31 0 4297048     52 -     S                   0 ttys001   0:00.6
在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以, 当我使用 ps -l 的时候,只有三个 PID。 列出目前所有的正在内存当中的程序


ps aux

# USER               PID %CPU %MEM     VSZ   RSS   TT STAT STARTED     TIME COMMAND
# kenny             6155 21.3 1.7 7969944 284912   ?? S   二03下午 199:14.14 /Appl...OS/WeChat
# kenny             559 20.4 0.8 4963740 138176   ?? S   二03下午 33:28.27 /Appl...S/iTerm2
# _windowserver     187 18.0 0.6 7005748 95884   ?? Ss   二03下午 288:44.97 /Syst...Light.WindowServer -daemon
# kenny             1408 10.7 2.1 5838592 347348   ?? S   二03下午 138:51.63 /Appl...nts/MacOS/Google Chrome
# kenny             327   5.8 0.5 5771984 79452   ?? S   二03下午   2:51.58 /Syst...pp/Contents/MacOS/Finder


USER:该 process 属于那个使用者账号的
PID :该 process 的号码
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?
另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
D :该进程不可中断的睡眠状态。
X :该进程退出状态,进程即将被销毁。
K:正在休眠,而且不可以被唤醒,该进程可以被中断
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令

top 显示或管理执行中的程序


-b:以批处理模式操作;
-c:显示完整的治命令;
-d:屏幕刷新间隔时间;
-I:忽略失效过程;
-s:保密模式;
-S:累积模式;
-i<时间>:设置间隔时间;
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
-n<次数>:循环显示的次数。

实例:


top - 09:44:56 up 16 days, 21:23,  1 user, load average: 9.59, 4.75, 1.92
Tasks: 145 total,   2 running, 143 sleeping,   0 stopped,   0 zombie
Cpu(s): 99.8%us,  0.1%sy,  0.0%ni,  0.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4147888k total, 2493092k used, 1654796k free,   158188k buffers
Swap: 5144568k total,       56k used, 5144512k free, 2013180k cached

解释:

  • top - 09:44:56[当前系统时间],
  • 16 days[系统已经运行了16天],
  • 1 user[个用户当前登录],
  • load average: 9.59, 4.75, 1.92[系统负载,即任务队列的平均长度]
  • Tasks: 145 total[总进程数],
  • 2 running[正在运行的进程数],
  • 143 sleeping[睡眠的进程数],
  • 0 stopped[停止的进程数],
  • 0 zombie[冻结进程数],
  • Cpu(s): 99.8%us[用户空间占用CPU百分比],
  • 0.1%sy[内核空间占用CPU百分比],
  • 0.0%ni[用户进程空间内改变过优先级的进程占用CPU百分比],
  • 0.2%id[空闲CPU百分比], 0.0%wa[等待输入输出的CPU时间百分比],
  • 0.0%hi[],
  • 0.0%st[],
  • Mem: 4147888k total[物理内存总量],
  • 2493092k used[使用的物理内存总量],
  • 1654796k free[空闲内存总量],
  • 158188k buffers[用作内核缓存的内存量]
  • Swap: 5144568k total[交换区总量],
  • 56k used[使用的交换区总量],
  • 5144512k free[空闲交换区总量],
  • 2013180k cached[缓冲的交换区总量],

htop [非内部命令]一个互动的进程查看器,可以动态观察系统进程状况。


-C --no-color               使用单色配色方案
-d --delay=DELAY           设置更新之间的延迟,在十秒
-s --sort-key=COLUMN       纵列排序(try --sort-key=help for a list)
-u --user=USERNAME         只显示一个指定用户的进程
-p --pid=PID,[,PID,PID...] 只显示给用户
-h --help                   打印此命令帮助
-v --version               打印版本信息

使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。Htop不是系统默认安装的,所以需要额外安装。

Linux Process

kill 删除执行中的程序或工作


-a:当处理当前进程时,不限制命令名和进程号的对应关系;
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
-s <信息名称或编号>:指定要送出的信息;
-u:指定用户。

只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略, 下面是常用的信号:


HUP     1   终端断线
INT     2   中断(同 Ctrl + C)
QUIT    3   退出(同 Ctrl + \)
TERM   15   终止
KILL    9   强制终止
CONT   18   继续(与STOP相反, fg/bg命令)
STOP   19   暂停(同 Ctrl + Z)

killall 使用进程的名称来杀死一组进程


-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。

杀死所有同名进程


killall vi

nc 命令用于设置路由器。


-g<网关> 设置路由器跃程通信网关,最丢哦可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源位址> 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 显示指令执行过程。
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。

TCP端口扫描


[root@localhost ~]# nc -v -z -w2 192.168.0.3 1-100
192.168.0.3: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.0.3] 80 (http) open
(UNKNOWN) [192.168.0.3] 23 (telnet) open
(UNKNOWN) [192.168.0.3] 22 (ssh) open

扫描192.168.0.3 的端口 范围是 1-100 扫描UDP端口


[root@localhost ~]# nc -u -z -w2 192.168.0.1 1-1000 # 扫描192.168.0.3 的端口 范围是 1-1000

扫描指定端口


[root@localhost ~]# nc -nvv 192.168.0.1 80 # 扫描 80端口
(UNKNOWN) [192.168.0.1] 80 (?) open
y //用户输入

查看从服务器到目的地的出站端口 443 是否被防火墙阻止


nc -vz acme-v02.api.letsencrypt.org 443 -w2
# Ncat: Version 7.50 ( https://nmap.org/ncat )
# Ncat: Connected to 23.77.214.183:443.
# Ncat: 0 bytes sent, 0 bytes received in 0.07 seconds.

w 显示目前登入系统的用户信息


-h, --no-header     不打印头信息;
-u, --no-current   当显示当前进程和cpu时间时忽略用户名;
-s, --short         使用短输出格式;
-f, --from         显示用户从哪登录;
-o, --old-style     老式输出
-i, --ip-addr       显示IP地址而不是主机名(如果可能)

    --help     显示此帮助并退出
-V, --version 显示版本信息。

who 显示目前登录系统的用户信息


-H或--heading:显示各栏位的标题信息列;
-i或-u或--idle:显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串;
-m:此参数的效果和指定"am i"字符串相同;
-q或--count:只显示登入系统的帐号名称和总人数;
-s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;
-w或-T或--mesg或--message或--writable:显示用户的信息状态栏;
--help:在线帮助;
--version:显示版本信息。

jobs 显示Linux中的任务列表及任务状态


-l:显示进程号;
-p:仅任务对应的显示进程号;
-n:显示任务状态的变化;
-r:仅输出运行状态(running)的任务;
-s:仅输出停止状态(stoped)的任务。

jobs -l               #显示当前系统的任务列表

bg 用于将作业放到后台运行


bg 1            #后台执行任务号为1的任务

fg 将后台作业放到前台终端运行


fg 1          #将任务转换到前台执行