了解进程
进程定义
- 已经启动的可执行的运行实例
组成
- 已经分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
程序和进程的区别
- 程序:二进制文件
- 进程:是程序运行时的过程,动态,有生命周期及运行状态
进程的生命周期
父进程复制自己的地址空间,创建一个新的子进程. 每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性只需. PID和父进程(PPID)是子进程环境的元素 . 任何进程都可以创建子进程
所有进程都是第一个系统进程的后代
- centos5,6的PID为1的进程是init
- centos7的PID为1的进程是systemd
僵尸进程
- 父进程退出了,子进程没有退出.这些子进程没有父进程来管理,就变成了僵尸进程
查看进程
PS -aux
常用的参数
- a: 显示跟当前终端关联的所有进程
- u: 基于用户的格式显示
- x: 显示所有进程,不以终端机来区分
[root@VM_0_15_centos ~]# ps -aux
oot | 1 | 0.0 | 0.3 | 191008 | 3624 | ? | Ss | Aug13 | 2:02 | /usr/lib/systemd/systemd --switched-ro |
root | 2 | 0.0 | 0.0 | 0 | 0 | ? | S | Aug13 | 0:00 | [kthreadd] |
root | 3 | 0.0 | 0.0 | 0 | 0 | ? | S | Aug13 | 0:31 | [ksoftirqd/0] |
root | 5 | 0.0 | 0.0 | 0 | 0 | ? | S< | Aug13 | 0:00 | [kworker/0:0H] |
root | 7 | 0.0 | 0.0 | 0 | 0 | ? | S | Aug13 | 0:00 | [migration/0] |
root | 8 | 0.0 | 0.0 | 0 | 0 | ? | S | Aug13 | 0:00 | [rcu_bh] |
user | 启动这些进程的用户 |
pid | 进程的id |
%cpu | 进程占用cpu百分比 |
%men | 进程占用内存的百分比 |
vsz | 进程占用的虚拟内存大小(单位kb) |
rss | 进程占用的物理内存大小(kb) |
tty | 进程在哪个终端上运行 |
stat | 该进程目前的状态 |
start | 被触发启动的时间 |
time | 实际使用cpu运作的时间,有显示0:00的,耗费cpu资源不到1秒 |
command | 该程序的实际指令 |
stat选项详解
- R:该程序目前正在运行,或者可被运行
- S:该程序目前正在睡眠
- T:该程序目前正在侦测或者停止了,
- Z:该程序应该已经终止,但是其父进程无法正常的终止他,造成zombie僵尸程序的状态
- D:不可中断状态|
五个基本状态后面还可以加一些字母
- <:表示进程运行在高优先级上
- N:表示进程运行在低优先级上
- L:表示进程有页面锁定在内存中
- s:表示进程是控制进程
- l:表示进程是多线程的
- +:表示当前进程运行在前台
tty选项详解
- ?:表示与终端没有关系,大部分是内核的
- tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示由网络连接进主机的程序(是虚拟的)
ps -ef
- -e: 显示所有进程
- -f: 显示完整格式输出
[root@VM_0_15_centos ~]# ps -ef
root | 1 | 0 | 0 | Aug13 | ? | 00:02:02 | /usr/lib/systemd/systemd --switched-root --system --des |
root | 2 | 0 | 0 | Aug13 | ? | 00:00:00 | [kthreadd] |
root | 3 | 2 | 0 | Aug13 | ? | 00:00:31 | [ksoftirqd/0] |
root | 5 | 2 | 0 | Aug13 | ? | 00:00:00 | [kworker/0:0H] |
root | 7 | 2 | 0 | Aug13 | ? | 00:00:00 | [migration/0] |
UID | 启动这些进程的用户 |
PID | 进程的ID |
PPID | 父进程的ID号 |
C | 进程生命周期的利用率 |
Stime | 启动启动时的系统时间 |
tty | 进程在哪个终端上运行 |
time | 运行进程累计需要的cpu时间 |
cmd | 启动的程序名称 |
uptime
查看系统负载
[root@VM_0_15_centos ~]# uptime
19:36:10 up 13 days, 3:47, 1 user, load average: 0.00, 0.01, 0.05
19:36:10 | 当前时间 |
up 13 days | 系统运行时间,说明这台服务器已经开机13天了 |
1 user | 当前登录的用户数 |
load average: 0.00, 0.01, 0.05 | cpu系统负载,即cpu任务队列的平均长度,三个数值分别是1分钟,5分钟,15分钟的平均值 |
互动:
找出当前系统中,cpu负载过高的服务器
服务器:load average 0.15, 0.08, 0.01 1核
服务器:load average 4.15, 6.08, 6.01 1核
服务器:load average 10.15, 10.08, 10.01 4核
答案:4核
经验:单核心,1分钟的系统平均负载不差过3,就可以,这是个经验值
top
[root@VM_0_15_centos ~]# top
top - 19:42:40 up 13 days, 3:54, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 74 total, 2 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.0 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1014888 total, 65276 free, 108852 used, 840760 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 733124 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3504 root 20 0 611428 13364 1972 S 0.7 1.3 64:16.54 barad_agent
14759 root 20 0 146564 10968 3112 S 0.3 1.1 1:14.98 YDService
1 root 20 0 191008 3624 2284 S 0.0 0.4 2:02.70 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.08 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:31.08 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
- 第一行,系统负载
- 第二行,进程信息
- tesks(当前任务数)
- running 运行
- sleeping 睡眠
- stopped 终止
- zombie 僵尸进程
- 第三行cpu信息
- us:用户占用cpu的时间
- sy:内核占用cpu
- ni:用户进程空间内改变过优先级占用的cpu
- id:空闲cpu的百分比
- wa:当对磁盘进行大量写时,发现IO等待会占用很多cpu,如果正常使用占用比较多cpu,磁盘性能有问题
- hi:硬件中断占用的cpu,硬件驱动通常是内核中的一个子进程,而不是一个独立的进程
- si:软中断,占用的cpu百分比,往磁盘写入数据有个队列,所占用的时间
- st:虚拟机占用物理机cpu时间
- 第四行内存信息
- 单位kb
- total 总内存
- free 空闲
- used 占用
- buff/cache 这里的缓存是可以释放的
- 第五行 swap
- total 交换区总量
- free 空闲的交换区总量
- used 使用的交换区总量
- avail Mem 总共的可利用内存是多少
- 注意:如果swap分区,被使用,那么你的内存不够用了
PID | 进程ID |
USER | 进程所有者 |
PR | 优先级 |
NI | nice值 |
VIRT | 进程使用的虚拟内存总量 |
RED | 进程使用的物理内存总量 |
SHR | 共享内存大小 |
S | 进程状态 |
%CPU | 进程占用的CPU百分比 |
%MEM | 进程占用的物理内存百分比 |
TIME+ | 进程使用的CPU总时间 |
COMMAND | 命令行 |
快捷键
- 默认 3s 刷新一次
- 按s修改刷新时间
- 按空格立即刷新
- 按大写的 C 按照cpu占用排序
- 按大写的 M 安装内存占用排序
- 按数字键1,显示每个内核的cpu使用频率
- 按u: 显示指定的用户
- h:帮助
- q:退出
例:-p通过进程ID查看单个进程
[root@VM_0_15_centos ~]# top -p 3081
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3081 root 20 0 112864 4304 3284 S 0.0 0.4 0:59.84 sshd
例:找出系统中占用系统进程最多的进程
[root@VM_0_15_centos ~]# top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2438 polkitd 20 0 614312 10460 1992 S 0.2 1.0 0:30.25 polkitd
3504 root 20 0 611428 13364 1972 S 0.2 1.3 64:21.77 barad_agent
14759 root 20 0 146876 11204 3112 S 0.2 1.1 1:18.95 YDService
在linux系统中最多可以使用100%CPU吗
lsof命令
选项
- -p 进程号,列出指定进程号打开的文件
- -i 条件:列出符合条件的进程
查看某个进程读了那些文件,调用了那些东西呢,一般用于木马进程
[root@VM_0_15_centos ~]# ps aux | grep ssh | grep -v grep
root 448 0.0 0.5 156744 5440 ? Ss 16:43 0:00 sshd: root@pts/0
root 3081 0.0 0.4 112864 4304 ? Ss Aug13 1:02 /usr/sbin/sshd -D
root 8557 0.0 0.5 156624 5120 ? Ss 17:53 0:00 sshd: unknown [priv]
sshd 8558 0.3 0.2 112864 2224 ? S 17:53 0:00 sshd: unknown [net]
[root@VM_0_15_centos ~]# lsof -p 3081
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 3081 root cwd DIR 253,1 4096 2 /
sshd 3081 root rtd DIR 253,1 4096 2 /
sshd 3081 root txt REG 253,1 853040 16204 /usr/sbin/sshd
sshd 3081 root mem REG 253,1 61624 22098 /usr/lib64/libnss_files-2.17.so
...
查看端口,或者看黑客开启的后门端口是哪个进程在使用
[root@VM_0_15_centos ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 448 root 3u IPv4 13695793 0t0 TCP VM_0_15_centos:ssh->144.0.8.26:9545 (ESTABLISHED)
sshd 3081 root 3u IPv4 22003 0t0 TCP *:ssh (LISTEN)
pstree
以树形图显示进程,只显示进程的名字,且相同进程合并显示
[root@VM_0_15_centos ~]# pstree
systemd─┬─YDLive───{YDLive}
├─YDService───11*[{YDService}]
├─acpid
├─2*[agetty]
├─atd
├─auditd───{auditd}
├─barad_agent─┬─barad_agent
│ └─barad_agent───3*[{barad_agent}]
├─crond
├─dbus-daemon
├─dhclient
├─lsmd
├─lvmetad
├─ntpd
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sgagent───{sgagent}
├─sshd─┬─sshd───bash───pstree
│ └─sshd───sshd
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
pstree -p 进程ID
[root@VM_0_15_centos ~]# pstree -p 3081
sshd(3081)───sshd(448)───bash(493)───pstree(9591)
# 管理进程
通过信号来管理进程
列出所有信号
[root@VM_0_15_centos ~]# 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 | 键盘中断ctrl+c |
3 | SIGQUIT | 退出 |
9 | SIGKILL | 强制退出 |
15 | SIGTERM | 终止(正常结束),缺省信号 |
18 | SIGCONT | 继续 |
19 | SIGSTOP | 停止 |
20 | SIGTSTP | 暂停 ctrl+z |
关闭进程
- 1,kill [信号] [进程ID]
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
root 10472 0.0 0.2 159780 2188 pts/1 S+ 18:10 0:00 top
[root@VM_0_15_centos ~]# kill 3 10472
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
- 2,killall 和 pkill 命令通过指定名字来杀死进程
killall
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
root 11480 0.0 0.2 159780 2148 pts/1 S+ 18:18 0:00 top
[root@VM_0_15_centos ~]# killall top
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
[root@VM_0_15_centos ~]#
pkill
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
root 11676 0.0 0.2 159780 2144 pts/1 S+ 18:20 0:00 top
[root@VM_0_15_centos ~]# pkill top
[root@VM_0_15_centos ~]# ps aux | grep top | grep -v grep
[root@VM_0_15_centos ~]#
进程优先级管理
设置优先级,通过ctrl+z挂起进程
[root@VM_0_15_centos ~]# nice -n 5 vim h.txt
[1]+ Stopped nice -n 5 vim h.txt
查看进程的PID
[root@VM_0_15_centos ~]# ps aux | grep vim | grep -v grep
root 12206 0.0 0.4 151272 4944 pts/0 TN 18:24 0:00 vim h.txt
根据PID查看进程的信息
[root@VM_0_15_centos ~]# top -p 12206
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12206 root 25 5 151272 4944 2584 T 0.0 0.5 0:00.02 vim
可以发现优先级是5
前台后台进程切换
&用在一个命令的最后,可以把这个命令放到后台执行
[root@VM_0_15_centos ~]# top &
[2] 13061
ctrl + z可以将一个正在前台执行的程序放到后台
[root@VM_0_15_centos ~]# ll > ./123.txt
[root@VM_0_15_centos ~]# tail -f ./123.txt
-rw-r--r-- 1 root root 136 Aug 24 23:25 2.txt
-rw-r--r-- 1 root root 49 Aug 24 23:23 a.txt
-rw-r--r-- 1 root root 50 Aug 24 14:12 b.txt
-rw-r--r-- 1 root root 12 Aug 24 23:05 cpu.txt
-rw-r--r-- 1 root root 52428800 Aug 24 23:16 c.txt
drwxr-xr-x 2 root root 4096 Aug 21 21:22 DES_DIR
-rw-r--r-- 1 root root 97 Aug 24 23:07 eof.sh
-rw-r--r-- 1 root root 275 Aug 21 21:38 packups.sh
-rw-r--r-- 1 root root 146 Aug 21 21:47 ping.sh
-rw-r--r-- 1 root root 292 Aug 21 21:59 useradd1.sh
^Z
[4]+ Stopped tail -f ./123.txt
jobs查看当前有多少在后台运行的进程,这是一个作业控制命令
[root@VM_0_15_centos ~]# jobs
[1] Stopped nice -n 5 vim h.txt
[2] Stopped top
[3]- Stopped top
[4]+ Stopped tail -f ./123.txt
fg命令将后台中的命令调到前台继续运行,
[root@VM_0_15_centos ~]# fg 4
tail -f ./123.txt
我们再次远程,进行更改文件
[root@VM_0_15_centos ~]# ls >> 123.txt
发现在监视改文件
[root@VM_0_15_centos ~]# fg 4
tail -f ./123.txt
123.txt
1.txt
2.txt
a.txt
b.txt
cpu.txt
c.txt
DES_DIR
eof.sh
packups.sh
ping.sh
useradd1.sh
实战:使用screen后台实行执行命令备份命令
xshell长时间连接,如果本地网络偶尔断开或者xshell不小心关闭,都会让后台运行的备份命令停止运行的
- 正确做法使用:screen
安装
[root@VM_0_15_centos ~]# yum install screen -y
用法:
执行screen,将打开一个全新的会话
运行你的备份任务,或者vim a.txt命令
这时可以键入快捷键ctrl+a+d
就已经分离出一个单独的会话
[root@VM_0_15_centos ~]# screen
[detached from 15042.pts-0.VM_0_15_centos]
screen -ls 查看已经建立的会话id
[root@VM_0_15_centos ~]# screen -ls
There is a screen on:
15042.pts-0.VM_0_15_centos (Detached)
1 Socket in /var/run/screen/S-root.
[root@VM_0_15_centos ~]#
通过PID 重新连接会话
[root@VM_0_15_centos ~]# screen -r 15042
创建会话时也可以指定名称
[root@VM_0_15_centos ~]# screen -S text
当不想使用screen会话了,exit退出
[root@VM_0_15_centos ~]# exit