进程是一个在系统中运行的程序,每个进程都是一个运行的实体,并占用一定的系统资源
程序:二进制文件,是可以实现特定目标或解决特定问题的代码集
进程类型
守护进程:在系统引导过程中启动的进程,跟终端无关的进程
前台进程:跟终端相关,通过终端启动的进程
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的PID,满足跟踪安全性之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代
子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec(执行)自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信息请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵尸(zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变。
R运行状态(runing): 表明进程在运行中,或者在运行队列里,准备运行
S可中断睡眠状态(sleeping):意味着进程在等待事件的完成
D磁盘睡眠状态(Disk sleep): 也叫不可中断睡眠,在这个状态的进程通常会等待IO的结束
T暂停状态(stopped):也叫跟踪状态,可以通过发送SIGSTOP信号,进程响应SIGSTOP信号而进入T暂停状态,这个被暂停的进程可以通过发送SIGCNT信号让进程继续运行。
Z僵尸状态(zombie):内核发送SIGCHKD信号通知父进程回收所有的资源
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
僵尸进程:当一个进程fork一个子进程之后,如果子进程退出,而父进程没有利用wait 或者waitpid 来获取子进程的状态信息时就会产生僵尸进程,那么子进程的状态描述符依然保存在系统中,并且会一直等待父进程读取退出状态代码
孤儿进程:当一个父进程fork一个子进程之后,父进程突然被终止了,那么这个子进程就成为了一个孤儿进程,它会被init进程接管
僵尸进程与孤儿进程的区别:
[root@server2 ~]# top
top - 08:29:01 up 13:12, 2 users, load average: 0.00, 0.01, 0.05
内 容 | 说 明 |
---|---|
08:29:01 | 系统时间 |
up 13:12 | 运行时间 |
2 users | 登录终端数 |
load average: 0.00,0.01,0.05 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。该值若超过系统CPU核数,则为超负荷运行 |
- 获取CPU核数:
[root@server2 ~]# grep 'core id' /proc/cpuinfo | wc -l 2
Tasks: 108 total, 1 running, 107 sleeping, 0 stopped, 0 zombie
内 容 | 说 明 |
---|---|
Tasks: 108 total | 进程总数 |
1 running | 正在运行的进程数 |
107 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数。若非 0,需要手工检查僵尸进程 |
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni,99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
内 容 | 说 明 |
---|---|
%Cpu(s): | CPU占比 |
0.0us | user:用户模式CPU占比 |
0.2sy | system:系统模式CPU占比 |
0.0ni | nice:改变过优先级的用户进程CPU占比 |
99.8id | idle:空闲CPU占比 |
0.0wa | wait:等待I/O的进程CPU占比 |
0.0hi | 硬中断请求服务的CPU占比 |
0.0si | 软中断请求服务的CPU占比 |
0.0st | steal time:虚拟时间的CPU占比,虚拟机 CPU 等待实际 CPU 的时间占比 |
CPU负载测试 => cat /dev/urandom |md5sum
KiB Mem : 1863028 total, 989344 free, 189552 used, 684132 buff/cache
内 容 | 说 明 |
---|---|
KiB Mem | 物理内存,单位为KB |
1863028 total | 总内存 |
989344 free | 空闲的内存 |
189552 used | 己经使用的内存 |
684132 buff/cache | 作为缓冲的内存 |
KiB Swap: 2097148 total, 2097148 free, 0 used. 1569572 avail Mem
内 容 | 说 明 |
---|---|
KiB Swap | 交换分区,单位为KB |
2097148 total | 交换分区(虚拟内存)的总大小 |
2097148 free | 空闲的交换分区 |
0 used | 已经使用的交换分区的大小 |
1569572 avail Mem | 已被提前加载的内存量 |
在Linux操作系统分区时,最少需要3个分区:
/boot分区 : 系统分区
swap交换分区 :一般情况下为内存的1~2倍,但是尽量不要超过2G,当计算机的内存不足时,系统会自动从硬盘中划出一块区域充当内存使用。
/分区 :根分区,所有文件都存放于此
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125528 4008 2624 S 0.0 0.2 0:01.13 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kworker/u256:0
字段 | 说明 |
---|---|
PID | 进程 ID |
USER | 进程所属的用户 |
PR | 优先级,数值越小优先级越高 |
NI | NICE优先级,数值越小优先级越高,取值范围-20到19,默认都是0 |
VIRT | 虚拟内存大小,单位KB |
RES | 物理内存大小,单位KB |
SHR | 共享内存大小,单位KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的 CPU 时间 |
COMMAND | 进程名 |
按键 | 作用 |
---|---|
M | 按内存的使用排序 |
P | 按CPU使用排序 |
N | 以PID的大小排序 |
R | 对排序进行反转 |
1 | 显示所有CPU的负载 |
z | 彩色 |
q | 退出 |
[root@server1 ~]# free
total used free shared buff/cache available
Mem: 1863016 138672 1533568 9760 190776 1569968
Swap: 2097148 0 2097148
[root@server1 ~]# free -m
total used free shared buff/cache available
Mem: 1819 135 1497 9 186 153
Swap: 2047 0 2047
选项说明:
-m : 单位为MB,不加该选项默认为KB
df = disk free
[root@server1 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 1.9G 16G 11% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
选型说明:
-h :以较高的可读性显示磁盘剩余空间大小
-T :显示文件系统类型
可以用来查看各分区可用内存的大小
ps不同于top,静态查看进程信息。日常ps命令常用于查询某个进程的PID或PPID或者结合grep获取某个具体进程的信息
[root@server1 ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:01 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 2
root 2 0 0 12:01 ? 00:00:00 [kthreadd]
root 4 2 0 12:01 ? 00:00:00 [kworker/0:0H]
root 5 2 0 12:01 ? 00:00:00 [kworker/u256:0]
root 6 2 0 12:01 ? 00:00:00 [ksoftirqd/0]
root 7 2 0 12:01 ? 00:00:00 [migration/0]
root 8 2 0 12:01 ? 00:00:00 [rcu_bh]
[root@server1 ~]# ps -ef | grep crond
root 684 1 0 12:01 ? 00:00:00 /usr/sbin/crond -n
root 11559 11488 0 16:02 pts/0 00:00:00 grep --color=auto crond
#以上信息只有第一行是crond的进程,第二行,是grep命令所启动的进程
[root@server1 ~]# ps -ef |grep crond |grep -v "grep"
root 684 1 0 12:01 ? 00:00:00 /usr/sbin/crond -n
[root@server1 ~]# ps -aux #不建议
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 125528 4008 ? Ss 12:01 0:01 /usr/lib/systemd/systemd --switched-root --system
root 2 0.0 0.0 0 0 ? S 12:01 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 12:01 0:00 [kworker/0:0H]
root 11566 0.0 0.1 155448 1868 pts/0 R+ 16:13 0:00 ps -aux
[root@server1 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 125528 4008 ? Ss 12:01 0:01 /usr/lib/systemd/systemd --switched-root --syste
root 2 0.0 0.0 0 0 ? S 12:01 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 12:01 0:00 [kworker/0:0H]
选项说明:
-e : 列出全部进程
-f : full,显示全字段
-ef: 显示全部进程
-u : 以用户为中心组织进程状态信息显示
-a : 与终端相关的进程
-x : 与终端无关的进程
aux: 显示全部进程
#“ps -aux”不同于“ps aux”,POSIX和UNIX标准要求“ps -aux”打印名为“x”的用户拥有的所有进程,如果名为“x”的用户不存在,此时ps会将该命令解释为“ps aux”
[root@server1 ~]# useradd x
[root@server1 ~]# ps -aux
PID TTY TIME CMD
8448 tty1 00:00:00 su
8449 tty1 00:00:00 bash
11617 pts/1 00:00:00 su
11618 pts/1 00:00:00 bash
11642 pts/0 00:00:00 ps
字段 | 说明 |
---|---|
UID | 用户ID |
PID | 进程ID |
PPID | 该进程的父级进程ID,如果找不到,则该进程就被称之为僵尸进程 |
C/%CPU | Cpu的占用率,其形式是百分数 |
STIME | 进程的启动时间 |
TTY | 终端设备,显示“?”则表示该进程并不是由终端设备发起 |
TIME | 进程实际使用CPU的时间 |
CMD | 该进程的名称或者对应的路径 |
USER | 用户 |
%MEM | 内存的占用率 |
VSZ | 进程占用的虚拟内存 |
RSS | 进程占用的固定的内存 |
STAT | 进程目前的状态 |
[root@server1 ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 902/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1284/master
tcp6 0 0 :::22 :::* LISTEN 902/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1284/master
[root@server1 ~]# netstat -tnlp | grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 902/sshd
tcp6 0 0 :::22 :::* LISTEN 902/sshd
选项说明:
-t:表示只列出tcp 协议的连接
-u:表示只列出udp 协议的连接
-n:表示将地址从字母组合转化成ip 地址,将协议转化成端口号来显示
-l:只列中LISTEN(监听)的连接
-p:显示进程pid和进程名称
[root@server1 ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:* users:(("sshd",pid=902,fd=3))
LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=1284,fd=13))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=902,fd=4))
LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1284,fd=14))
[root@server1 ~]# ss -tnlp | grep ssh
LISTEN 0 128 *:22 *:* users:(("sshd",pid=902,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=902,fd=4))
netstat与ss比较
用法&选项基本相同
netstat信息比较简洁,ss更加丰富
ss执行效率比netstat略高一些
列出所有支持的信号
[root@server1 ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
常用信号
编号 | 信号名 | 作用 |
---|---|---|
1 | SIGHUP | 重新加载配置 |
2 | SIGINT | 键盘中断^C |
3 | SIGQUIT | 键盘退出 |
9 | SIGKILL | 强制终止 |
15 | SIGTERM | 终止(正常结束) |
18 | SIGCONT | 继续 |
19 | SIGSTOP | 停止 |
20 | SIGTSTP | 暂停^Z |
根据pid发射信号(建议用来结束单个进程)
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
root 684 1 0 12:01 ? 00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill 684 #不加选项,默认为-15,终止进程
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
root 11767 1 0 17:13 ? 00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill -9 11767 #-9强制终止进程
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
根据进程名结束进程(可一次结束多个进程,包括父进程fork出的子进程)
[root@server1 ~]# systemctl restart crond.service
[root@server1 ~]# killall crond
[root@server1 ~]# ps -ef | grep crond | grep -v 'grep'
[root@server1 ~]# w
17:24:29 up 5:23, 3 users, load average: 0.03, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 12:01 5:20m 0.10s 0.00s bash
root pts/0 192.168.226.1 14:52 5.00s 0.08s 0.00s w
root pts/1 192.168.226.1 17:22 13.00s 0.01s 0.00s -bash
[root@server1 ~]# pkill -t pts/1
[zhangsan@server1 ~]$
Session terminated, killing shell... ...已杀死。
[root@server1 ~]# w
17:30:23 up 5:28, 4 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 12:01 5:25m 0.10s 0.00s bash
root pts/0 192.168.226.1 14:52 7.00s 0.08s 0.00s w
root pts/1 192.168.226.1 17:22 31.00s 0.01s 0.01s -bash
zhangsan pts/2 192.168.226.1 17:30 5.00s 0.00s 0.00s -bash
[root@server1 ~]# pkill -u zhangsan
[zhangsan@server1 ~]$ Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(192.168.226.10:22) at 23:02:56.
Type `help' to learn how to use Xshell prompt.
[D:\~]$
选项说明:
-t:指定踢出终端
-u:指定踢出终端上登录的用户
作业控制是一个命令行功能,允许一个shell实例来运行和管理多个命令。
如果没有作业控制,父进程fork()一个子进程后,将sleeping,直到子进程退出使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让shell可以在子进程运行期间返回接受其他命令
作用:
前台:foreground ,前台进程是在终端中运行的命令,该终端为进程的 控制终端 。前台进程接受键盘产生的输入和信号,并允许从终端读取或写入到终端。
后台:background ,后台进程没有控制终端 ,它不需要终端的交互。
sleep:用于延迟shell脚本的时间,默认单位为s
------------------------------------------------
& 将程序放到后台执行
[root@server1 ~]# sleep 3000 &
[1] 11898
^Z,将前台的程序挂起(暂停)到后台
[root@server1 ~]# sleep 2000
^Z
[2]+ 已停止 sleep 2000
[root@server1 ~]# ps -ef | grep sleep | grep -v 'grep'
root 11898 11488 0 17:45 pts/0 00:00:00 sleep 3000
root 11900 11488 0 17:49 pts/0 00:00:00 sleep 2000
查看后台作业
[root@server1 ~]# jobs
[1]- 运行中 sleep 3000 &
[2]+ 已停止 sleep 2000
让后台停止的作业在后台运行
[root@server1 ~]# bg %2
[2]+ sleep 2000 &
[root@server1 ~]# jobs
[1]- 运行中 sleep 3000 &
[2]+ 运行中 sleep 2000 &
将后台作业调回前台
[root@server1 ~]# fg %1
sleep 3000
终止前台作业^C
每个CPU(或CPU核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的CPU及核心数量。Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而给用户多个进程在同时运行的假象。
由于不是每个进程都与其他进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的的调度策略为SCHED_OTHER(也称为SCHED_NORMAL),SCHED_OTHER调度策略运行的进程的相对优先级称为进程的nice值。
Nice值:-20~+19
NI 优先级,数值越小优先级越高,可以人为更改。(NI = NICE = Nice)
PR 优先级,将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
获取进程PID
[root@server1 ~]# top -bn 1 #静态一屏获取所有进程信息
685 root 20 0 25908 956 756 S 0.0 0.1 0:00.00 atd
交互修改
[root@server1 ~]# top
r-->685-->-5-->q
PID to renice [default pid = 1] 685
Renice PID 685 to value -5
查看
[root@server1 ~]# top -p 685 #只查看pid=685的进程的信息
685 root 15 -5 25908 956 756 S 0.0 0.1 0:00.00 atd
获取进程PID
[root@server1 ~]# ps -ef |grep atd |grep -v 'grep'
root 685 1 0 12:01 ? 00:00:00 /usr/sbin/atd -f
调整NICE值
[root@server1 ~]# renice -10 685
685 (进程 ID) 旧优先级为 -5,新优先级为 -10
注意:nice只能调整没有运行的程序
关闭
[root@server1 ~]# ps -ef |grep crond |grep -v 'grep'
root 8536 1 0 12:36 ? 00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill 8536
nice调整优先级,并启动程序
[root@server1 ~]# nice -n -10 crond
查看
[root@server1 ~]# ps -ef |grep crond
root 8542 1 0 12:38 ? 00:00:00 crond
[root@server1 ~]# top -p 854
8542 root 10 -10 126384 1320 716 S 0.0 0.1 0:00.00 crond
r1 ~]# renice -10 685
685 (进程 ID) 旧优先级为 -5,新优先级为 -10
#### nice
> 注意:nice只能调整没有运行的程序
```powershell
关闭
[root@server1 ~]# ps -ef |grep crond |grep -v 'grep'
root 8536 1 0 12:36 ? 00:00:00 /usr/sbin/crond -n
[root@server1 ~]# kill 8536
nice调整优先级,并启动程序
[root@server1 ~]# nice -n -10 crond
查看
[root@server1 ~]# ps -ef |grep crond
root 8542 1 0 12:38 ? 00:00:00 crond
[root@server1 ~]# top -p 854
8542 root 10 -10 126384 1320 716 S 0.0 0.1 0:00.00 crond