文章目录
助记提要
- uptime查看开机时间和负载;
- free查看内存使用;
- swap创建交换分区;
- vmstat查看系统状态信息;
- mpstat查看各个处理器信息;
- top查看服务器运行状态;
- iostat查看磁盘I/O信息;
- pidof找进程PID;
- sar查看服务器性能和网络信息;
- lsof和fuser查找进程;
- ps查看进程状态;
- kill结束进程;
- 作业控制;
- trap捕捉信号;
- nohup切换到后台运行;
进程和性能篇
1 uptime
查看开机时长,查看CPU的负载情况
uptime
15:41:11 up 41 days, 23:17, 1 user, load average: 0.00, 0.01, 0.05
命令输出依次是:系统时间,启动时长,用户总连接数,1、5、15分钟的系统平均负载。
系统平均负载是指在特定时间间隔内运行队列中的平均进程数。
平均负载体现了系统的繁忙程度。一般单核的负载在0.7以下是安全的的,超过0.7就需要进行优化了。
cat /proc/loadavg
0.02 0.04 0.05 2/225 10252
前面是平均负载,第四个是正在运行的进程数/总进程数;第五个是最近启动的进程的ID。
2 free
free显示系统的内存使用状况。默认以KB为单位显示。
-m
选项可以让输出的信息以MB为单位展示。
-g
选项让输出的信息以GB为单位展示。
-b
使输出的信息以byte为单位展示。其他选项-k, -m, -g都会向下取整再输出。-b是内存信息的最精确的结果。
free命令的输出项
total:总内存
used:使用中的内存。used=total-free-buffers-cache
free:未使用的内存。
shared:系统中多个进程共享的内存容量。
buff:内核缓冲区。大量数据需要写入硬盘时,会先写到buffer缓冲区,然后慢慢写入硬盘,避免应用程序做无效的等待。
cache:从硬盘读取的数据会暂存在缓存cache中,再次读到时,就不需要去硬盘找了。减少内存从磁盘读数据的次数。
buffers和cached的值是从/proc/meminfo文件读取的。/proc中的内容大部分是Linux内核控制和更新的。
3 SWAP空间
SWAP,交换分区,即虚拟内存。
当内存不足时,系统会将内存中长时间不被访问和更新的数据临时写到SWAP中,释放相应的内存空间,供系统中当前运行的程序使用。
当程序要使用SWAP中的数据时,系统会再次从SWAP中读取之前保存的数据写到内存中。
服务器的SWAP建议设置为内存的1~2.5倍之间。
SWAP本质上是硬盘的一块区域,存储内存中临时交换的数据。
这个区域可以是一个独立的分区,也可以是一个独立的文件。
3.1 分区型SWAP
# 启动fdisk
fdisk /dev/vda2
在fdisk的命令行,通过以下步骤把分区做成SWAP分区。
输入p展示分区信息;
输入t,表示指定分区类型;
输入数字,选择对应分区;
输入l,列出fdisk支持的所有分区类型;
输入82,指定分区类型为swap;
# 建立SWAP分区
mkswap /dev/vda2
# 启用SWAP分区
swapon /dev/vda2
# 关闭SWAP分区
swapoff /dev/vda2
3.2 文件型SWAP
将一个文件指定为SWAP。假如要创建一个256M的SWAP空间,需要先创建一个256M的文件。
# 创建文件
dd if=/dev/zero of=/tmp/rocswap bs=1M count=256
# 建立SWAP分区
mkswap /tmp/rocswap
# 启用和关闭
swapon /tmp/rocswap
swapoff /tmp/rocswap
3.3 swappiness值
系统中有一个参数swappiness,辅助控制内存不足的界限。
swappiness可设置为0-100的值。值为0时,禁用SWAP;值为100时,疯狂使用SWAP,严重影响性能。
4 vmstat性能查看
vmstat是强大的Linux性能监控工具。
vmstat命令基本格式vmstat [options] [delay [count]]
# 间隔1秒,输出2次系统状态信息
vmstat 1 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 145140 2104 1501620 0 0 0 2 1 1 1 1 98 0 0
0 0 0 145080 2104 1501620 0 0 0 14 695 1492 1 0 99 0 0
4.1 vmstat输出内容
输出的信息分为6组
- 进程 procs
r,示进程队列中的进程个数;
b,示处于不可中断状态的进程个数; - 内存 memory
swpd,虚拟内存使用量;
free,空闲内存量;
buff,内存中的buffers使用量;
cache,内存中cache使用量; - 交换分区 swap
si,每秒从交换分区写入内存的量;
so,每秒从内存写入交换分区的量; - 块设备 io
bi,每秒从块设备读取的块数;
bo,每秒向块设备写入的块数; - 系统 system
in,每秒中断数;
cs,每秒上下文切换次数; - CPU
us,用户进程CPU耗时百分比;
sy,内核进程CPU耗时百分比;
id,CPU空闲状态时间百分比;
wa,IO等待耗时百分比;
st,虚机管理程序耗时百分比;
vmstat的第一行数字是自服务器启动至今的各项指标的平均值,不是最新状态值。第二行开始才能反应服务器的最新状态。
4.2 vmstat选项
-a
选项会把buff和cache信息换为inact和active信息。inact表示非活跃内存,一段时间内未被使用过(会优先交换到SWAP)。active表示正在被使用中的内存。
-f
查看服务器的forks数量。
-m
展示内存slabinfo。
-s
内存指标和系统事件信息。
-d
磁盘统计信息。
-p
展示特定分区的I/O信息。
forks 由fork、vfork和clone三类系统调用产生,可以理解为系统的总任务数。一个进程可以包含多个任务,任务数取决于该进程创建的线程数。可以提取一段时间的forks差值判断性能问题是否是forks骤增导致的。
4.3 vmstat结果解读
- 如果cache较大,则系统缓存了较多磁盘数据,相应的bi会小;
- si和so如果长期大于0,表示系统需要经常读写交换分区,会很消耗CPU和磁盘性能。可能需要扩容内存或迁移过多的服务。
- free数值接近于0时,不一定是系统内存快耗尽了。大部分情况下是buff和cache占用了很多内存资源。
- bi和bo很大,系统正在进行大量的磁盘操作。
- 如果us值经常大于50%,说明用户程序需要进行一定的优化。
- sy一般较低,否则是系统出现问题。运行带有大量系统调用的程序时,sy可能会很高。
- wa高,即CPU总在等待I/O操作,说明磁盘成为主要的瓶颈,可以升级为更快的高性能磁盘。也可能是程序存在大量的随机读操作,需要考虑调整为顺序读。
- r的数目如果总是超过CPU的核数,说明CPU为性能瓶颈,可以考虑开启超线程、换更多核数的CPU、调整某些进程的NICE优先级。
- 打开大型程序的同时又想开启另一个大的程序,so数值会升高。
5 mpstat多核统计
mpstat用于多处理器的统计工作。
命令格式mpstat [options] [<interval> [<count>]]
5.1 mpstat输出的统计指标
%usr,用户进程使用CPU的百分比;
%nice,对进程降级时CPU的百分比;
%sys,内核进程使用的CPU百分比;
%iowait,等待I/O的CPU百分比;
%irp,处理系统中断的CPU百分比;
%soft,软件中断的CPU百分比;
%steal,虚机管理程序占用的CPU百分比;
%guest,运行虚拟处理器占用的CPU百分比;
%gnice,
%idle,CPU空闲时间;
5.2 P选项指定CPU
-P
选项展示指定CPU的运行状态。
# 查看第一个CPU的运行状态
mpstat -P 1
Linux 3.10.0-514.21.1.el7.x86_64 (AIO-tech-G) 03/24/2023 _x86_64_ (14 CPU)
10:54:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:54:49 PM 1 0.75 0.00 0.21 0.02 0.00 0.00 0.00 0.00 0.00 99.02
# 查看全部CPU的运行状态
mpstat -P ALL
5.3 I选项报告中断处理情况
处理器的运算速度比外部硬件快很多。中断机制让CPU可以在外部硬件操作时把当前进程挂起,CPU可以杯其他进程使用。硬件处理完后通知CPU,系统会把当前进程设为活动状态,继续执行。
时钟中断为定时器提供了基础。如果没有时钟中断,程序需要每执行几条指令就查一下系统时间,效率极低。
-I
选项用来报告CPU的中断处理情况。有三个可选参数:SUM、CPU、ALL。
参数SUM会显示所有CPU的中断数之和
mpstat -I SUM
Linux 4.18.0-193.28.1.el8_2.x86_64 (iZbp1amv9wo6c55lurbstsZ) 03/24/2023 _x86_64_ (1 CPU)
11:01:10 PM CPU intr/s
11:01:10 PM all 107.38
参数CPU会展示每一个CPU的中断处理状况
mpstat -I CPU
Linux 4.18.0-193.28.1.el8_2.x86_64 (iZbp1amv9wo6c55lurbstsZ) 03/24/2023 _x86_64_ (1 CPU)
11:00:27 PM CPU 0/s 1/s 4/s 8/s 9/s 11/s 12/s 14/s 15/s 24/s 25/s 26/s 27/s 28/s 29/s 30/s NMI/s LOC/s SPU/s PMI/s IWI/s RTR/s RES/s CAL/s TLB/s TRM/s THR/s DFR/s MCE/s MCP/s HYP/s HRE/s HVS/s ERR/s MIS/s PIN/s NPI/s PIW/s
11:00:27 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.19 0.00 0.00 0.00 0.63 0.00 0.00 106.53 0.00 0.00 0.03 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
参数ALL会把SUM和CPU的内容合在一起展示。
6 top命令
top是很常用的Linux性能监控工具,它会展示详细的服务器运行状态,并周期性地更新。
6.1 top的输出
top命令的输出内容分为上下两部分:系统及数据和进城级数据。
top
top - 14:12:21 up 44 days, 21:48, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 145 total, 2 running, 143 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32779828 total, 15061812 free, 589236 used, 17128780 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 31754936 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13819 root 20 0 1057392 120100 18676 S 1.0 0.4 522:59.47 YDService
12600 root 20 0 688828 18388 3284 S 0.3 0.1 220:18.76 barad_agent
1 root 20 0 52144 4328 2592 S 0.0 0.0 11:34.95 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:01.40 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:04.71 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
第一行是系统启动信息。内容和uptime命令的输出完全一致。
第二行是进程统计信息。系统进程总数、运行状态进程数、睡眠状态进程数、停止状态的进程数、僵尸状态进程数。
第三行是各个动作占用的CPU时长统计,从左到右依次是:用户进程、内核进程、改变过优先级的进程、空闲状态、IO等待、硬中断、软中断、虚拟机管理程序。
第四行是内存信息,第五行是交换分区信息,和free的输出基本一致。
6.2 top命令列管理
进入top命令后,单击f键,会进入进程信息列选择页面。
上下方向键浏览,d键或空格键可以切换是否显示该列;右方向键可以选中该列上下移动位置,回车或左方向键确定位置。
q键结束调整,返回top页面。
按大写W键,将调整好的设置保存到/root/.toprc
6.3 top命令进程数据
进程信息的每一列的意义:
PID,进程ID;
PPID,进程的父进程ID;
USER,启动进程时用的用户名;
PR,进程优先级;
NI,用于调节优先级,-20到20的整数,负数表示优先级提升,正数表示优先级降低。
VIRT,进程使用的虚拟内存量;
RES,进程使用的未被换出的物理内存量;
SHR,共享内存量;
S,进程状态,R运行,S睡眠,D不可中断的睡眠状态,T跟踪、停止,Z僵尸;
%CPU,进程占用的CPU时间占比;
%MEM,进程使用的物理内存占比;
TIME+,进程占用的CPU时间总和,单位为1/100秒;
COMMAND,进程对应的命令名;
TTY,启动该进程的终端名称;
P,此进程最近一个时刻使用的CPU的编号;
CODE,进程对应的可执行代码占用的物理内存量;
DATA,进程对应的数据部分(数据段、栈等)占用的物理内存量;
nFLT,页面错误次数;
nDRT,最后一次写入到现在,被修改过的页面数;
WCHAN,睡眠中的系统调用名;
Flags,进程标志;
6.4 top命令排序
在top命令页面,按大写P键则根据%CPU全局排序,按大写M键则根据%MEM排序。
其它列可以在列选择页面按s键指定。
可以按大写R键切换升序和降序。
其它快捷键:
b,把处于R状态的进程高亮显示;
d,设置top命令刷新的间隔;
m,内存信息和交换分区信息(第四五行)的显示开关;
l,系统负载信息(第一行)的显示开关;
t,CPU和进程统计信息(第二三行)的显示开关;
c,是否显示完整的命令行;
6.5 top命令CPU和内存
在top页面按数字1,会展示每一个CPU核心的性能数据。
如果某个CPU核心的负载很高,可以先选择把P信息显示出来,然后使用b快捷键高亮正在运行的程序,然后就能看到在这个CPU核心上运行的进程了。可以去/proc查看此进程的相关信息。
进程的内存指标
/proc中有很多以数字命名的目录,这些数字对应当前的每一个进程。其中的statm文件表示的就是进程的内存信息。
statm中只有一行7个数字,单位为4KB(top命令中的单位为KB)。
这7个数字分别表示:
VIRT,虚拟内存。包括进程通过malloc/calloc函数申请的内存,或堆/栈占用的内存,或全局变量占用的内存,都属于VIRT。VIRT是进程占用的内存的最大集;
RES,常驻内存。malloc申请了内存后,不会立即用到。系统会在真正使用到的时候才正式将北村分配给这个进程。RES表示的是进程真正在使用的物理内存的大小,而非申请的大小。
SHR,共享内存。进程中有多少内存是被共享的。
CODE,即Trs,Text Resident Set,进程的机器指令部分的大小。
DATA,即Drs,除了CODE外的内存空间。
SWAP,进程被置换的虚拟空间的大小。
7 iostat
iostat可以显示CPU统计信息以及整个系统、适配器、tty设备和硬盘的输入/输出信息。
命令格式为iostat [options] [<interval> [<count>]]
iostat
Linux 3.10.0-957.el7.x86_64 (AIO-tech-F1) 03/26/2023 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.40 0.00 0.20 0.08 0.00 99.32
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 11.74 0.56 90.12 2185169 350244108
vdb 0.30 0.02 6.68 74741 25954076
第一部分是系统信息,系统名称、内核版本和架构信息。
第二部分是CPU信息。
第三部分是磁盘信息。列出了各个存储设备的I/O状况。
7.1 磁盘信息指标解释
tps,每秒进程的I/O读写请求总数;
kB_read/s,每秒读取的字节数;
kB_wrtn/s,每秒写入的字节数;
kB_read,读取的字节总数;
kB_wrtn,写入的字节总数;
7.2 iostat选项
-d
选项指定只显示磁盘的使用状态。
-c
选项指定只显示CPU的使用状态。
-k
选项表示以KB作为单位。
-y
在多次采样时,不显示第一组数据。
-x
显示更多的磁盘统计数据。
7.3 -x选项的输出
iostat -d -x -k
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 8.73 0.02 11.72 0.56 90.12 15.45 0.02 2.16 4.69 2.16 0.39 0.46
vdb 0.00 0.53 0.00 0.30 0.02 6.68 44.87 0.00 2.44 2.15 2.44 0.53 0.02
rrqm/s,每秒对该设备的读请求被合并次数。文件系统会对读写同块(block)的请求进行合并。
wrqm/s,每秒对该设备的写请求被合并次数。
r/s,每秒完成的读I/O次数。
w/s,每秒完成的写I/O次数。
rkB/s,每秒读千字节数。
wkB/s,每秒写千字节数。
avgrq-sz,平均每次I/O操作的数据大小。
avgqu-sz,平均等待处理的I/O请求队列长度。
await,平均每次I/O请求等待时间,包括等待时间和处理时间,单位ms。一般应该低于5ms。
svctm,平均每次I/O操作的服务时间,单位ms。
%util,每秒用于I/O操作的时间比率,即I/O队列非空的时间比率。r/s + w/s * svctm / 1000。
如果%util太大,说明I/O请求过多,磁盘存在瓶颈;
如果await大于svctm,差值越大,说明等待时间越长,系统出了问题;
7.4 CPU信息
iostat -c
avg-cpu: %user %nice %system %iowait %steal %idle
0.40 0.00 0.20 0.08 0.00 99.32
%user,用户应用程序执行产生的时间百分比;
%nice,应用程序使用NICE权限执行时产生的时间百分比;
%system,系统内核执行时产生的时间百分比;
%iowait,CPU空闲且系统有未完成的磁盘I/O请求的时间百分比;
%steal,hypervisor服务另一个虚拟处理器时,虚拟CPU等待实际CPU的时间百分比;
%idle,CPU空闲且系统没有未完成的I/O请求的时间百分比;
NICE表示进程优先级的修正数值,PRI=PRI+NICE。NICE为负时,PRI变小,优先级会变高。
steal值比较高的话,说明服务器上的另一个虚拟机拥有更大更多的CPU时间,占用了你的CPU时间。需要想主机供应商申请扩容虚拟机。
%idle值高但系统响应慢时,可能是CPU等待分配内存,此时应加大内存。%idle值持续低于10,表明系统的CPU资源不足。
8 pidof
用来找程序的进程ID。
-x
找到运行shell脚本的shell的pid。
-s
仅展示1个pid。
-o
指定忽略某个pid。
有一个readproc()函数,会遍历/proc目录然后找匹配的进程。pidof和killall5都用到了这个函数。
pidof的返回值有两个,至少找到了一个对应的pid时返回0,没找到任何pid时返回1。
9 sar
sar命令可以查看服务器性能信息。
sar命令格式sar [options] [<interval> [<count>]]
。
9.1 把sar信息存到文件
把sar输出存到文件中
sar 2 3 -o op_info
存储时不指定文件名,sar的输出会存储在/var/log/sa/saDD文件中。其中DD是当天的日期数字。
sar存储输出时存的是结构化的数据,不能直接读取。使用-f选项:
sar -f op_info
-o选项使用追加的形式写入文件。如果指定的文件不是sar的结构数据格式,就无法记录进去。
9.2 sar选项
P
指定展示哪一块CPU。
b
报告I/O使用情况以及传输速率。
B
展示页的使用状况。
d
每一个块设备的使用情况。
I
展示中断情况。
n
展示网络情况。
q
展示队列长度和负载信息。
r
内存和交换区使用情况。
R
内存情况。
u
CPU使用情况(默认)。
v
展示内核表信息。
w
任务创建和上下文切换信息。
y
设定TTY设备的信息。
A
展示所有sar信息。
e
指定统计的结束时间,可以使用hh:mm:ss的格式指定。搭配-o选项来指定统计的结束时间。搭配-f选项来指定读取的时间区间。
9.3 sar查看网络信息
-n选项查看网络信息。可用的参数有DEV,EDEV,SOCK。
- DEV查看网络设备信息
sar -n DEV 1 1
06:00:24 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
06:00:25 PM eth0 9.00 8.00 0.73 2.06 0.00 0.00 0.00
06:00:25 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
IFACE,网络设备名称;
rxpck/s,每秒收到的包数;
txpck/s,每秒发送出的包数;
rxkB/s,每秒收到的字节数;
txkB/s,每秒发出的字节数;
rxcmp/s,每秒接收到的压缩包数;
txcmp/s,每秒发送出的压缩包数;
rxmcst/s,每秒收到的组播包数;
- EDEV查看网络设备失败情况
sar -n EDEV 1 1
06:03:50 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:03:51 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:03:51 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
rxerr/s,每秒中接收到的损坏包数;
txerr/s,发送包时,每秒钟发生的错误数;
coll/s,发送包时,每秒发生的冲撞数,只有半双工模式下才有;
rxdrop/s,由于缓冲区满,接收端每秒丢掉的网络包数;
txdrop/s,由于缓冲区满,发送端每秒丢掉的网络包数;
txcarr/s,发送包时,每秒载波错误发生的次数;
rxfram/s,接收包时,每秒发生的帧对齐错误次数;
rxfifo/s,接收包时,每秒缓冲区溢出错误的次数;
txfifo/s,发送包时,每秒缓冲区溢出错误的次数;
- SOCK参数展示socket连接
06:08:18 PM totsck tcpsck udpsck rawsck ip-frag tcp-tw
06:08:19 PM 175 24 7 0 0 0
Average: 175 24 7 0 0 0
totsck,被使用的socket总数;
tcpsck,用于TCP的socket数;
udpsck,用于UDP的socket数;
rawsck,用于RAW的socket数;
ip-frag,当前的IP分片数目;
10 lsof查找进程
10.1 lsof基本使用
定位打开文件的进程lsof 文件名
;
文件描述符定位进程lsof -d 文件描述符
;
进程打开的文件lsof -p 进程ID
;
用户打开的文件lsof -u 用户
;
查看哪些程序占用指定端口lsof -i[46] [protocol][@host][:service|port]
;
rm命令删除文件时,只是把文件的link数减少了。Linux系统只会把link数为0的文件从磁盘删除。当删除文件并没有释放空间时,说明有进程还在打开着这个文件,可以用lsof找到这个进程。
发现有文件一直在增大,占用过多空间时,可以使用lsof发现这个进程。
要使用的端口被占用时,lsof可以找到是哪个进程在占用这个端口。
Linux系统会为每一个运行中的进程在/proc目录下创建一个目录,目录下有一个fd目录,存放着进程打开的所有文件。lsof搜索的就是/proc/$PID/fd下面的文件。
10.2 lsof的输出
lsof | head -n 3
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 4096 2 /
systemd 1 root rtd DIR 253,1 4096 2 /
- COMMAND,命令;
- PID,进程标识符;
- TID,
- USER,进程所有者;
- FD,文件描述符;
- TYPE,文件类型。常见类型有DIR(目录),REG(普通文件),CHR(字符类型),BLK(块设备类型),UNIX(UNIX域套接字),FIFO(先进先出队列),IPv4/IPv6(IP套接字)。
- DEVICE,磁盘名称;
- SIZE/OFF,文件的大小;
- NODE,索引节点(文件在磁盘的标识);
- NAME,打开文件的确切名称;
10.3 FD信息
FD可以是文件描述符和描述文件特征的标识。
文件描述符
文件描述符,0表示标准输入,1表示标准输出,2表示标准错误输出,n表示其他文件描述符数值。
文件描述符后可以跟文件状态模式和文件锁。
- 文件状态模式:u表示文件打开且处于读取/写入模式;r表示文件打开且处于只读模式;w表示文件打开且处于可写模式;空格表示该文件状态模式未知且未被锁定;-表示该文件状态模式未知且被锁定。
- 文件锁:r文件的部分读锁;R整个文件的读锁;w文件部分写锁;W整个文件的写锁。
描述文件特征的标识
- cwd,应用程序的当前工作目录,也是该应用程序启动的目录;
- txt,文件为程序代码或数据;
- mem,内存映射文件;
- pd,父目录;
- rtd,根目录;
- DEL,文件已被进程删除但还存在于内存中;
11 fuser
fuser的功能和lsof命令很类似。
Linux操作系统是完全支持POSIX(Portable Operating System Interface 可以直接操作系统接口)标准的。但lsof不是POSIX标准中规定的命令,fuser是POSIX标准的命令集。
列出所有正在打开当前目录的进程
fuser -v .
USER PID ACCESS COMMAND
当前目录: root 32119 ..c.. bash
ACCESS
fuser输出中的ACCESS表示进程和指定文件的访问关系。
访问关系有如下几种:
c:把文件作为当前目录使用;
e:把此文件作为可执行文件使用;
r:把此文件作为根目录使用;
s:把此文件作为共享库使用;
m:把此文件作为映射文件或共享库;
f:打开此文件。默认不显示。
F:打开此文件,用于写操作。默认不显示。
# 显示打开当前目录的的进程,进程号后面的c即为ACCESS
fuser .
.:32119c
-m
选项展示有多少进程在使用某个目录下面的文件(所有的子目录和文件);
fuser查看占用了某个端口的进程:
fuser -v -n tcp 22
fuser -v 22/tcp
fuser可以发送信号。-k选项可以在找到进程的同时杀死进程。
fuser -v -k .
12 ps命令
ps用于查看进程状态。
12.1 ps的书写格式
BSD格式,选项前不加横线-,各个选项可以组合在一起使用;
UNIX格式,选项前加横线-,几个选项可以组合在一起使用;
GNU格式,选项前加双横线–。
一般都是用的BSD和UNIX格式。
12.2 ps的选项
基本选项
a
显示关联在终端上的所有进程;
-a
显示关联在终端上的所有进程,除了会话首进程;
-e
显示全部进程;
-d
显示全部进程,除了会话首进程;
r
仅显示运行状态的进程;
T
当前终端上的进程;
x
对没有关联到终端的进程也展示出来;
筛选选项
-U
按实际用户DI筛选进程;
-u
按有效用户ID筛选进程;
-s
指定展示某个会话的进程;
-C
按命令筛选进程;
控制输出格式选项
u
按用户名和进程号的顺序展示进程;
e
在命令后面展示环境;
k(--sort)
指定按哪一列排序。+升序,-降序;
-F
显示详细的进程信息;
f
按ascii码显示树状结构,表示进程间的相互关系;
-H
用缩进显示树状结构,表示进程间的相互关系;
-j
以任务格式显示进程;
j
以任务格式显示进程;
展示线程
-L
展示特定进程的线程信息;显示的LWP列表示用户线程ID;
-T
展示特定进程的线程信息,显示的SPID是指系统中的线程ID;
12.3 ps输出列
ps可选的输出列有98个,常用的列解释如下:
- %CPU,进程占用的CPU时间占比;
- %MEM,进程使用的物理内存占比;
- ADDR,进程的内存地址;
- C或CP,CPU利用率;
- CMD或COMMAND,进程名及参数;
- NI,进程的NICE值;
- F,进程的信号量,用于进程互斥加锁;
- PID,进程ID;
- PPID,进程的父进程ID;
- PRI,优先级;
- RSS,实际内存用量;
- S或STAT,进程状态,S休眠,R可运行,Z僵尸,T停止,0正在运行;
- START或STIME,进程的开始时间;
- SZ,虚拟内存使用量;
- TIME,进程占用的CPU时间总和;
- TT或TTY,启动此进程的终端名称;
- UID或USER,进程所有者的用户ID;
- WCHAN,睡眠中的系统调用名;
13 kill命令
kill命令会向进程发送特定的信号,让进程自杀。
13.1 信号
-l选项可以查看kill可以发送的全部信号:
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
可以在-l选项后面指定参数来查询对应的名称或编号
kill -l 1
HUP
kill -l BUS
7
常见信号的含义
- HUP,终端断线;
- INT,终端,同Ctrl+C;
- QUIT,退出,同Ctrl+\;
- TERM,终止;
- KILL,强制终止;
- CONT,继续(与STOP相反,fg/bg命令);
- STOP,暂停,同Ctrl+Z;
13.2 kill选项和进程号
kill的命令格式kill [选项] [进程号]
-l选项列出信号类型。-l后加信号名称或编号,查看对应的编号或名称。
-s选项可以指定要发出的信号,-s 信号
等同于-信号
。
不写选项,则会向目标进程发送SIGTERM信号。
kill后跟的进程号如果大于0,则向目标进程发送信号;多个进程号用空格分开;
进程号等于0,向当前进程组的所有进程发送信号;
进程号等于-1,向除当前kill进程和init进程外的所有进程发送信号;
进程号小于-1,如-5,则向进程组PGID为5的所有进程发送信号;
# 等效的4种写法
kill -9 pid
kill -KILL pid
kill -SIGKILL pid
kill -s 9 pid
- 9号信号
SIGKILL信号没有通知进程让其自我清理,而是在进程运行中让它突然终止。可能会造成资源无法释放、数据无法同步到磁盘的情况。SIGKILL无法终止进程号为1的init进程。 - 0号信号
kill -l 0
T
0号信号是一个测试信号,可以测试目标进程是否存在,测试当前用户是否有向目标进程发送信号的权限。
14 作业控制命令
指对作业的行为进行控制,允许对作业的前后台切换和终止操作。
&命令:在执行的命令后面加上&号,会把命令放到后台执行。返回方括号里的任务编号,和任务对应的进程ID。当执行的命令有很多个时,会返回最后一个命令的进程ID。
sleep 1000 &
[1] 1570
Ctrl+Z组合键:把前台作业切换到后台。任务到了后台后会变成Stopped状态。
jobs:列出当前的作业列表。
bg:将一个后台处于Stopped状态的作业变为Running状态。
fg:把后台作业放到前台。
# 查看作业
jobs
[1]- Running sleep 1000 &
[2]+ Stopped sleep 200
# 让作业在后台继续运行
bg %2
# 把作业换到前台运行
fg %1
# 终止作业
kill %1
指代作业名字的方式
%数值:根据编号指定作业;
%String:匹配命令以String开头的作业。匹配到多个会报错。
%?String:匹配命令杭中含有String字符串的作业。若是通过管道相连的多个命令,则仅匹配第一个命令。
%%:指代作业列表中最近被切换到后台的作业。
%+:同%%。
%-:排在%%指代的作业的前面的一个作业。
# 运行三个后台作业
sleep 1000 & sleep 1000 & sleep 1000 &
[1] 7905
[2] 7906
[3] 7907
# 查看作业
jobs
[1] Running sleep 1000 &
[2]- Running sleep 1000 &
[3]+ Running sleep 1000 &
# 指代作业
bg %%
-bash: bg: job 3 already in background
bg %+
-bash: bg: job 3 already in background
bg %-
-bash: bg: job 2 already in background
15 用trap捕捉信号
信号是一种进程间通信手段,为进程提供了一种异步的软件中断机制。
进程收到信号后,会有三种可能的处理方式:忽略、触发默认动作、捕捉信号执行对应处理函数。
trap命令的语法:trap "commands" signal-list
。
当进程捕获到signal-list指定的信号后,就会调用command中设定的动作。
捕获信号技术在Shell编程中一般应用:
- 动态读取并更新配置文件;
- 定时清除临时文件;
- 忽略信号对程序可能的影响;
- 用户要退出程序时,询问是否确认退出。
屏蔽和恢复信号
屏蔽signal-list指定的信号的作用
trap "" signal-list
恢复信号的作用
trap signal-list
常见信号的含义
SIGHUP,用户终端连接结束时发出。登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,都属于这个Session。当用户退出Linux登录时,前台进程组合后台有对终端输出的进程会收到SIGHUP信号。这个信号默认操作为终止进程,因此前台和后台有终端输出的进程就会终止。与终端脱离关系的守护进程收到这个信号后会重新读取配置文件。
SIGINT,程序终止信号,Ctrl+C发出。
SIGQUIT,类似SIGINT,由Ctrl+\发出。
SIGFPE,发生致命的算术运算错误时发出。包括浮点运算错误、溢出及除数为0等所有算术错误。
SIGKILL,立即结束程序运行。该信号无法阻塞、处理和忽略。
SIGALARM,时钟定时信号,计算实际时间或时钟时间。
SIGTERM,程序结束信号。该信号可以被阻塞和处理。kill命令的默认信号。
16 nohup
用户注销、网络断开时,终端会收到SIGHUP(hangup)信号,然后关闭所有从属的子进程。
nohup可以使进程不被SIGHUP信号影响。
后台符&只能让进程切换到昂前终端的后台,SIGHUP仍然会影响这些进程。
nohup command &
在执行的命令前面加上nohup,后面加上&,就能让命令变为后台作业且不会被SIGHUP影响。
不指定输出的重定向文件时,标准输出和标准错误都会追加到nohup.out文件末尾。如果运行了多个nohup命令都没有指定输出重定向,多个命令的输出都会追加到一个文件中。
# 将标准输出重定向到cmd.log文件
nohup command > cmd.log &
# 同时把标准错误重定向到标准输出所在的文件
nohup command > cmd.log 2>&1 &
# 等价表达
nohup command 2> cmd.log 1>&2 &
nohup的返回值
一般情况下nohup的返回值就是执行的命令的返回值。例外情况有3种:
125,nohup命令失败,且POSIXLY_CORRECT环境变量未设置。
126,命令找到了但不能调用。
127,命令没找到。
nohup类似命令
让运行的进程不因用户注销或网络断开而中断,有两种办法。
让进程免疫SIGHUP信号(nohup和disown),让进程在新的会话中运行(setsid和screen)。
- disown
先用Ctrl+Z组合键和bg命令把前台运行的进程放到后台继续运行,然后执行disown -h %{jobid}
,把指定的作业从作业列表移除。 - setsid
setsid command
使命令在一个新的会话中执行,从而避开当前会话的SIGHUP信号。 - screen
screen可以在一个真实终端下运行多个伪终端,也能避开SIGHUP的影响。
# 开启一个名为screen_name的伪终端,在其中执行command
screen -A -m -d -S screen_name command &
# 列出所有运行中的会话
screen -list