目录
一、进程管理和性能相关工具
1、进程树pstree
pstree [-acglpsStuZ] [ -h | -H PID ] [ -n | -N type ] [ -A | -G | -U ] [ PID | USER ]
#常用选项
-a|--arguments #显示该进程的完整指令及参数
-A|--ascii #使用 ASCII 字符绘制线条
-c|--compact #不压缩相同的子树
-h|--highlight-all #高亮显示当前进程及父进程
-H PID|--highlight-pid=PID #高亮显示指定进程及父进程
-g|--show-pgids #显示进程组ID,包含 -c 选项
-G|--vt100 #使用VT100线条绘制字符
-l|--long #不要截断长线
-n|--numeric-sort #根据PID排序显示
-N type|--ns-sort=type #根据指定规则排序(cgroup|ipc|mnt|net|pid|user|uts)
-p|--show-pids #显示PID,包含 -c 选项
-s|--show-parents #显示父进程
-S|--ns-changes #显示命名空间
-t|--thread-names #显示完整线程名称
-T|--hide-threads #不显示线程
-u|--uid-changes #显示进程切换
-Z|--security-context #显示selinux相关信息
2、进程信息ps
ps: process state,可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中。
ps [options]
#支持三种风格选项: UNIX选项 如 -A -e; GNU选项 如 --help; BSD选项 如 a
#常用选项
a #选项包括所有终端中的进程
x #显示当前用户的进程信息,包括那些没有控制终端的进程
u #选项显示进程所有者的信息
f|--forest #选项显示进程树
k|--sort opt #属性 对属性排序,属性前加 - 表示倒序(--sort=uid,-ppid,+pid)
o #属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
L #显示线程信息
-C cmdlist #根据进程名称显示信息,多个命令用,分隔
-L #显示线程
-e #显示所有进程,相当于-A
-f #显示完整格式程序信息
-F #显示更完整格式的进程信息
-H #以进程层级格式显示进程相关信息
-u userlist|--user userlist #指定有效的用户ID或名称-进程执行
-U userlist|--User userlist #指定真正的用户ID或名称-发起
-g grplist|--group grplist #指定有效的gid或组名称
-G grplist|--Group grplist #指定真正的gid或组名称
-p pid #显示指定pid的进程
--ppid pid #显示属于pid的子进程
-t ttylist #指定tty,相当于 t
-M #显示SELinux信息,相当于Z
#显示所有所有进程,并列出属主
ps aux
#显示所有所有进程,并列出属主
ps -ef
#详细格式显示所有进程
ps -eFH
#显示指定列
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
#显示指定列
ps -axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
#查询你拥有的所有进程
ps -x
#显示指定用户名(RUID)或用户ID的进程
ps -fU apache
ps -fU 48
#显示指定用户名(EUID)或用户ID的进程
ps -fu hu
ps -fu 1000
#查看以root用户权限(实际和有效ID)运行的每个进程
ps -U root -u root
#列出某个组拥有的所有进程(实际组ID:RGID或名称)
ps -fG nginx
#列出有效组名称(或会话)所拥有的所有进程
ps -fg mysql
ps -fg 27
#显示指定的进程ID对应的进程
ps -fp 1234
#以父进程ID来显示其下所有的进程,如显示父进程为1234的所有进程
ps -f --ppid 1234
#显示指定PID的多个进程
ps -fp 1204,1239,1263
#要按tty显示所属进程
ps -ft pts/0
#以进程树显示系统中的进程如何相互链接
ps -e --forest
#以进程树显示指定的进程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
#要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列
ps -fL -C nginx
#要列出所有格式说明符
ps L
#查看进程的PID,PPID,用户名和命令
ps -eo pid,ppid,user,cmd
#自定义格式显示文件系统组,ni值开始时间和进程的时间
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
#使用其PID查找进程名称:
ps -p 1244 -o comm= #要以其名称选择特定进程,显示其所有子进程
ps -C sshd,bash
#查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用
ps -C httpd,sshd -o pid= #检查一个进程的执行时间
ps -eo comm,etime,user | grep nginx
#排序,查找占用最多内存和CPU的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
#显示安全信息
ps -eM
ps --context
#使用以下命令以用户定义的格式显示安全信息
ps -eo euser,ruser,suser,fuser,f,comm,label
#使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'
3、查看进程信息prtstat
prtstat 是一个用于显示进程详细统计信息的命令行工具,来自于psmisc包。它通过解析 /proc/<PID>/ 目录下的文件,提供进程的内存、CPU、状态等详细信息。
prtstat [options] PID ...
#选项
-r|--raw #信息的原始显示
#获取ping命令进程编号
[root@rocky-151 ~]#pidof nginx
19903 19902 19901
#显示进程信息
[root@rocky-151 ~]#prtstat 19902
Process with pid 0 does not exist.
Process: nginx State: S (sleeping)
CPU#: 1 TTY: 0:0 Threads: 1
Process, Group and Session IDs
Process ID: 19902 Parent ID: 19901
Group ID: 19901 Session ID: 19901
T Group ID: -1
Page Faults
This Process (minor major): 291 0
Child Processes (minor major): 0 0
CPU Times
This Process (user system guest blkio): 0.00 0.00 0.00 0.00
Child processes (user system guest): 0.00 0.00 0.00
Memory
Vsize: 15 MB
RSS: 5042 kB RSS Limit: 18446744073709 MB
Code Start: 0x5557c5b49000 Code Stop: 0x5557c5c14c8d
Stack Start: 0x7ffce14fc5b0
Stack Pointer (ESP): 0 Inst Pointer (EIP): 0
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
[root@rocky-151 ~]#prtstat -r 19902
pid: 19902 comm: nginx
state: S ppid: 19901
pgrp: 19901 session: 19901
tty_nr: 0 tpgid: -1
flags: 400140 minflt: 291
cminflt: 0 majflt: 0
cmajflt: 0 utime: 0
stime: 0 cutime: 0
cstime: 0 priority: 20
nice: 0 num_threads: 1
itrealvalue: 0 starttime: 308189
vsize: 15933440 rss: 1231
rsslim: 18446744073709551615 startcode: 93835467460608
endcode: 93835468295309 startstack: 140724088587696
kstkesp: 0 kstkeip: 0
wchan: 1 nswap: 0
cnswap: 1 exit_signal: 17
processor: 1 rt_priority: 0
policy: 0 delayaccr_blkio_ticks: 0
guest_time: 0 cguest_time: 0
[root@rocky-151 ~]#cat /proc/19902/stat
19902 (nginx) S 19901 19901 19901 0 -1 4194624 291 0 0 0 0 0 0 0 20 0 1 0 308189 15933440 1231 18446744073709551615 93835467460608 93835468295309 140724088587696 0 0 0 0 1073745920 402745863 1 0 0 17 1 0 0 0 0 0 93835468532048 93835468632832 93835496914944 140724088594204 140724088594220 140724088594220 140724088594408 0
4、设置和调整进程优先级
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
① nice命令
#以指定的优先级来启动进程
nice [OPTION] [COMMAND [ARG]...]
#选项
-n|--adjustment=N #以指定优先级运行程序
[root@rocky-151 ~]#nice -n 10 ping www.baidu.com
PING www.a.shifen.com (220.181.111.1) 56(84) bytes of data.
64 bytes from 220.181.111.1 (220.181.111.1): icmp_seq=1 ttl=128 time=10.7 ms
64 bytes from 220.181.111.1 (220.181.111.1): icmp_seq=2 ttl=128 time=9.65 ms
...
[root@rocky-151 ~]#ps axo pid,cmd,nice | grep ping
34498 ping www.baidu.com 10
34531 grep --color=auto ping 0
② renice命令
#可以调整正在执行中的进程的优先级
renice [-n] priority pid...
[root@rocky-151 ~]#pidof ping
34535
[root@rocky-151 ~]#renice -n -20 34535
34535 (process ID) old priority 10, new priority -20
[root@rocky-151 ~]#ps axo pid,cmd,nice | grep ping
34535 ping www.baidu.com -20
34555 grep --color=auto ping 0
5、搜索进程
常用命令:
ps options | grep 'pattern'
pgrep [options] pattern
/sbin/pidof COMMAND
① pgrep
pgrep [options] pattern
#常用选项
-d|--delimiter <string> specify output delimiter
-l|--list-name #列出进程ID和进程名
-a|--list-full #显示详细完整的进程信息
-v|--inverse #取反
-w|--lightweight #显示线程ID
-c|--count #统计匹配到的进程数量
-f|--full #使用完整的进程名匹配
-g|--pgroup <PGID,...> #指定进程的属组作为条件
-G|--group <GID,...> #指定 real group IDs 作为条件
-P|--parent <PPID,...> #显示指定进程的子进程
-s|--session <SID,...> #根据会话ID显示
-t|--terminal <tty,...> #显示指定终端的进程
-u|--euid <ID,...> #指定 effective UIDs
-U|--uid <ID,...> #指定 real IDs,真实用户
-x|--exact #根据指定的命令匹配
-F|--pidfile <file> #从文件中读取PID作为条件
[root@rocky-151 ~]#pgrep -a nginx
19901 nginx: master process /usr/sbin/nginx
19902 nginx: worker process
19903 nginx: worker process
[root@rocky-151 ~]#pgrep -at nginx
#查找指定终端的进程
[root@rocky-151 ~]#pgrep -at pts/1
34502 -bash
[xiaohu@rocky-151 ~]$echo $BASHPID
34627
[xiaohu@rocky-151 ~]$passwd
Changing password for user xiaohu.
Current password:
[root@rocky-151 ~]#ps aux | grep passwd
root 34655 0.0 0.3 233636 7040 pts/1 S+ 16:54 0:00 passwd
root 34686 0.0 0.1 221664 2176 pts/2 S+ 16:54 0:00 grep --color=auto passwd
[root@rocky-151 ~]#ps axo pid,cmd,user,ruser
...
34655 passwd root xiaohu
...
[root@rocky-151 ~]#pgrep -aU xiaohu
34610 /usr/lib/systemd/systemd --user
34612 (sd-pam)
34626 sshd: xiaohu@pts/1
34627 -bash
34655 passwd
② pidof
#查看相关命令的进程
pidof [options] [program [...]]
#常用选项
-s|--single-shot #多个结果时只显示一条
-x #按照脚本名称查找
-o|--omit-pid <PID,...> #不显示指定的pid
[root@rocky-151 ~]#pidof bash
34659 34627 2967
[root@rocky-151 ~]#pidof -s bash
34659
#按文件名查找
[root@rocky-151 ~]#./a.sh
[root@rocky-151 ~]#pidof -x a.sh
34699
[root@rocky-151 ~]#ps aux | grep 34699
root 34699 0.0 0.1 222520 3328 pts/2 S+ 16:58 0:00 /bin/bash ./a.sh
root 34737 0.0 0.1 221664 2176 pts/1 S+ 16:59 0:00 grep --color=auto 34699
#如果将文件名当bash的参数,则无法用-x 查找
#发起一个bash,将文件名当参数传给bash
[root@rocky-151 ~]#bash ./a.sh
[root@rocky-151 ~]#pidof -x a.sh
[root@rocky-151 ~]#pidof nginx
19903 19902 19901
[root@rocky-151 ~]#pidof -o 19903,19902 nginx
19901
6、负载查询uptime
uptime 是一个常用的 Linux/Unix 命令,用于显示系统的运行时间、当前登录用户数以及系统的平均负载。
[root@rocky8-153 ~]#uptime
17:10:11 up 7:01, 1 user, load average: 0.00, 0.00, 0.00
17:10:11 #系统当前时间
up 7:01 #系统己开机运行时长
1 user #当前有三个用户登录
load average: 0.00, 0.00, 0.00 #系统在1分钟,5分钟,15分钟的平均负载
#
[root@rocky-151 ~]#while(true);do uptime;sleep 1;done
[root@rocky-151 ~]#ping -f 127.1
[root@rocky-151 ~]#w
17:15:52 up 1:58, 4 users, load average: 0.17, 0.09, 0.03
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root seat0 16:02 0.00s 0.00s 0.02s /usr/libexec/gdm-wayland-session --register-se
root tty2 16:02 1:58m 0.10s 0.08s /usr/libexec/gnome-session-binary
root pts/1 16:58 0.00s 0.04s 0.01s w
root pts/3 17:12 2:24 0.18s 0.18s -bash
#
USER:登录用户的用户名
TTY:用户使用的终端设备(如 pts/0 表示伪终端,tty1 表示本地控制台)
LOGIN@:用户登录的时间
IDLE:用户空闲时间(未操作的时间)
JCPU:该终端关联的所有进程占用的 CPU 时间(单位:分钟)
PCPU:当前进程占用的 CPU 时间(单位:分钟)
WHAT:用户正在执行的命令或程序
系统平均负载:指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题。
7、显示CPU相关统计mpstat
mpstat(Multi-Processor Statistics)是一个用于监控 CPU 使用情况 的工具,属于 sysstat 软件包的一部分。它可以显示每个 CPU 核心或所有核心的平均利用率,帮助分析系统的 CPU 性能瓶颈。
mpstat [ options ] [ <interval> [ <count> ] ]
#常用选项
-P {cpu_list|ALL} #查看指定CPU,可以写成 0,1,2 0-2 2-
-I {SUM|CPU|SCPU|ALL} #显示指定中断数
-o JSON #以JSON格式输出
#查看当前主机所有cpu运行情况
[root@ubuntu-158 hu]#mpstat
Linux 6.14.0-33-generic (ubuntu-158) 10/03/2025 _x86_64_ (2 CPU)
09:22:24 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
09:22:24 AM all 0.05 0.01 0.16 0.01 0.00 0.01 0.00 0.00 0.00 99.75
#查看每个CPU情况
[root@ubuntu-158 hu]#mpstat -P ALL
Linux 6.14.0-33-generic (ubuntu-158) 10/03/2025 _x86_64_ (2 CPU)
09:23:34 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
09:23:34 AM all 0.05 0.01 0.16 0.01 0.00 0.01 0.00 0.00 0.00 99.76
09:23:34 AM 0 0.06 0.01 0.16 0.01 0.00 0.01 0.00 0.00 0.00 99.75
09:23:34 AM 1 0.05 0.01 0.16 0.01 0.00 0.01 0.00 0.00 0.00 99.76
#输出字段说明
%user #用户空间,应用程序占比
%nice #以nice优先级运行的进程用户态时间
%sys #内核空间,内核占比
%iowait #io等待占比
%irq #硬中断占比
%soft #软中断占比
%steal #虚拟化消耗占比
%guest #运行虚拟化主机cpu自身时间的占比
%gnice #运行虚拟cpu上的nice 进程的占比
%idle #空闲时间占比
8、查看进程实时状态 top 和 htop
① top
top -hv | -bcEHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]
#选项
-h|v #显示帮助
-b #显示全部所有进程
-c #显示命令信息
-E{k|m|g|t|p|e} #指定内存显示单位
-H #线程模式
-1 #十进制数字1,在首部分别显示每颗CPU信息
-p PID #显示指定进程的数据
-d N #指定刷新时间间隔,默认为3秒
-n N #刷新多少次后退出
-u|U user #查看指定用户的进程
-w cols #指定输出内容显示宽度
#交互环境下子命令
P #以CPU使用率排序,即 %CPU字段
M #以内存使用率排序,即 %MEM字段
T #以CPU使用时长排序,即 TIME+字段
1 #十进制数字1,在首部分开显示每颗CPU信息
l #小写L,是否显示首部top信息
t #切换首部tasks及cpu显示
m #切换首部内存信息显示
s #修改刷新时间间隔
k #终止指定进程
q #退出
h|? #显示帮助
[root@ubuntu-158 hu]#top
top - 09:35:05 up 7:26, 2 users, load average: 0.00, 0.01, 0.00
Tasks: 221 total, 1 running, 220 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 1598.3 total, 608.7 free, 455.0 used, 707.1 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1143.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21 root rt 0 0 0 0 S 0.3 0.0 0:00.80 migration/0
864 root 20 0 253544 10140 8476 S 0.3 0.6 1:34.34 vmtoolsd
2131 root 20 0 0 0 0 I 0.3 0.0 0:17.23 kworker/1:1-events
3171 root 20 0 10972 5976 3800 R 0.3 0.4 0:00.47 top
1 root 20 0 24620 15140 10788 S 0.0 0.9 0:07.55 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pool_workqueue_release
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/R-rcu_gp
5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/R-sync_wq
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/R-kvfree_rcu_reclaim
7 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/R-slub_flushwq
...
#首部CPU行字段说明
us #用户空间
sy #内核空间
ni #调整nice时间
id #空闲
wa #等待IO时间
hi #硬中断
si #软中断(模式切换)
st #虚拟化消耗占比
#10s刷新一次
[root@ubuntu ~]# top -d 10
#显示指定用户的进程统计
[root@ubuntu ~]# top -u xiaohu
#显示指定进程的线程
[root@ubuntu ~]# top -Hp 1444
#显示进程的具体命令
[root@ubuntu ~]# top -p 1331 -c
② htop
htop [-dCFhpustvH]
#常用选项
-d N #指定刷新时间
-u user #仅显示指定用户的进程
-s colume #以指定字段进行排序
#子命令
s #跟踪选定进程的系统调用
l #显示选定进程打开的文件列表
a #将选定的进程绑定至某指定CPU核心
t #显示进程树

9、内存空间free
free [options]
#常用选项
-b|--bytes #以字节为单位显示
-k|--kibi #以kb为单位显示
-m|--mebi #以MB为单位显示
-g|--gibi #以GB为单位显示
--tebi #以TB为单位显示
--pebi #以PB为单位显示
-h|--human #以人类友好阅读的形式显示
--si #以1000为单位,而不是1024
-t|--total #添加统计行
-l|--lohi #显示峰值和谷值
-s N|--seconds N #每隔N秒刷新一次
-c N|--count N #输出N次后退出
#字段说明
total #内存总量
used #已经使用的内存
free #空闲的内存
shared #多个进程共享的内存
buff/cache #缓冲和缓存使用的内存
available #可用内存
buffer / cache
缓冲(buffers) 是指在写磁盘时,先把要写的数据放入一个缓冲区,然后再批量写,以减少磁盘碎片和硬盘反复寻道,从而提高系统性能。主要用于硬盘与内存之间的数据交互。
缓存(cached) 是指文件的内容要被多个进程使用的时候,则可以将内容放入缓存区,则后续就可以直接从内存中读,而不用再消耗IO。cached主要作用于CPU和内存之间的数据交互(本来要用IO读硬盘文件,现在变成了读内存)。
向/proc/sys/vm/drop_caches中写入相应的修改值,会清理缓存。建议先执行sync(sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)。执行echo 1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的。
如果因为是应用有像内存泄露、溢出的问题时,从swap的使用情况是可以比较快速可以判断的,但通过执行free 反而比较难查看。但核心并不会因为内存泄露等问题并没有快速清空buffer或cache(默认值是0),生产也不应该随便去改变此值。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的。当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。
排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。
#清理缓存
[root@rocky8-153 ~]#cat /proc/sys/vm/drop_caches
0
[root@rocky8-153 ~]#free -h
total used free shared buff/cache available
Mem: 1.7Gi 236Mi 1.2Gi 8.0Mi 285Mi 1.3Gi
Swap: 2.0Gi 0B 2.0Gi
[root@rocky8-153 ~]#echo 3 > /proc/sys/vm/drop_caches
[root@rocky8-153 ~]#cat /proc/sys/vm/drop_caches
3
[root@rocky8-153 ~]#free -h
total used free shared buff/cache available
Mem: 1.7Gi 216Mi 1.4Gi 8.0Mi 81Mi 1.4Gi
Swap: 2.0Gi 0B 2.0Gi
10、进程对应的内存映射 pmap
pmap 是一个用于显示进程内存映射的 Linux 命令行工具。它可以展示进程的虚拟内存布局,包括代码段、数据段、堆、栈、共享库、匿名映射等详细信息。pmap对于调试内存问题、分析进程内存使用情况非常有用。
#查看进程的内存占用情况
map [options] PID [PID ...]
#常用选项
-x|--extended #显示详细信息
-X|-XX #显示更详细信息
-d|--device #显示设备
-q|--quiet #显示时不显示头尾
-p|--show-path #显示映射表中的完整路径
-A|--range=<low>[,<high>] #指定内存地址起始位置
##显示指定进程在内存中的占用情况
[root@ubuntu ~]# pmap 19902
[root@ubuntu ~]# pmap -x 19902
[root@ubuntu ~]# pmap -pd 19902
[root@ubuntu ~]# pmap -pd 19902 -A 00007fd2006f5000,00007fd1fffff000
#另一种查看方式
[root@ubuntu ~]# cat /proc/1331/maps
11、虚拟内存信息vmstat
虚拟内存
虚拟内存是操作系统提供的一种内存管理技术,操作系统会为每个进程分配一套独立的,连续的,私有的内存空间,让每个程序都以为自己独享所有主存的错觉,这样做的目的是方便内存管理。
程序所使用的内存是虚拟内存(Virtual Memory),CPU使用的内存是物理内存(Physical Memory) MMU LTB。
虚拟内存地址和物理内存地址之间的映射和转换由CPU中的内存管理单元(MMU)进行管理。
vmstat [options] [delay [count]]
#常用选项
-a|--active #分开显示活动和非活动内存
-s|--stats #显示事件统计
-d|--disk #统计磁盘设备相关信息
-D|--disk-sum #综合统计磁盘
-p|--partition <dev> #统计指定分区
-S|--unit <char> #指定显示单位 k|K|m|M
-w|--wide #以宽格式显示
-t|--timestamp #显示时间
#字段说明
procs:
r #可运行(正运行或等待运行)进程的个数,和核心数有关
b #处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
swpd #交换内存的使用总量
free #空闲物理内存总量
buffer #用于buffer的内存总量
cache #用于cache的内存总量
swap:
si #从磁盘交换进内存的数据速率(kb/s)
so #从内存交换至磁盘的数据速率(kb/s)
io:
bi #从块设备读入数据到系统的速率(kb/s)
bo #保存数据至块设备的速率
system:
in #interrupts 中断速率,包括时钟
cs #context switch 进程切换速率
cpu:
us #Time spent running non-kernel code
sy #Time spent running kernel code
id #Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa #Time spent waiting for IO. 2.5.41前,包括in idle.
st #Time stolen from a virtual machine. 2.6.11前, unknown.
12、统计CPU和设备IO信息iostat
iostat(Input/Output Statistics)是 sysstat 软件包中的一个工具,用于监控系统的 磁盘 I/O 和 CPU 使用情况。
iostat [ options ] [ <interval> [ <count> ] ]
#常用选项
-c #只显示CPU行
-d #显示设备〈磁盘)使用状态
-k #以千字节为为单位显示输出
-h|--human #以方便阅读的方式显示
-t #在输出中包括时间戳
-x #在输出中包括扩展的磁盘指标
#字段说明
tps #该设备每秒的传输次数,多个逻辑请求可能会被合并为一次I/O请求
kB_read/s #每秒向设备(drive expressed)写入的数据量
kB_read #读取的总数据量
kB_wrtn #写入的总数量数据量;这些单位都为Kilobytes
#[root@ubuntu-158 ~]#iostat 2
[root@ubuntu-158 ~]#dd if=/dev/zero of=./test.img bs=100M count=10
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 3.40232 s, 308 MB/s
13、监视磁盘I/Oiotop
iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO。
iotop [OPTIONS]
#常用选项
-o|--only #只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效
-b|--batch #非交互模式,一般用来记录日志
-n N|--iter=N #设置监测的次数,默认无限。在非交互模式下很有用
-d N|--delay=N #设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
-p PID|--pid=PID #指定监测的进程/线程
-u USER|--user=USER #指定监测某个用户产生的I/O
-P|--processes #仅显示进程,默认iotop显示所有线程
-a|--accumulated #显示累积的I/O,而不是带宽
-k|--kilobytes #使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用
-t|--time #加上时间戳,非交互非模式
-q|--quiet #禁止头几行,非交互模式,有三种指定方式
-q #只在第一次监测时显示列名
-qq #永远不显示列名
-qqq #永远不显示I/O汇总
#交互式子命令
left/right #改变排序列
r #反向排序
o #切换至选项--only
p #切换至--processes选项
a #切换至--accumulated选项
q #退出
i #改变线程的优先级
14、显示网络带宽使用情况 iftop
iftop -h | [-nNpblP] [-u unit] [-i interface] [-f filter code] [-F net/mask] [-G net6/mask6]
#常用选项
-h #显示帮助
-n #以IP的形式显示主机
-N #直接显示端口号,而不是服务名
-p #显示同一网段其它主机的流量
-b #不显示图形化的进度条
-B #以 bytes 为单位显示网络带宽
-a #以数据包为单位显示带宽
-i interface #指定监听的网卡
-F net/mask #只显示ipv4流量
-G net6/mask6 #只显示ipv6流量
-l #显示本地ipv6流量,默认关闭
-P #显示流量端口号
#以ip形式显示主机
[root@ubuntu ~]# iftop -n
#只监听ens160上 ipv4的流量
[root@ubuntu ~]# iftop -nF ens160
#显示进出流量的端口号
[root@ubuntu ~]# iftop -nPF ens160
15、查看网络实时吞吐量nload
nload [options] [devices]
#常用选项
-m #显示所有设备
-t N #数据刷新频率,单位毫秒,默认500
-u h|b|k|m|g|H|B|K|M|G #显示单位(h auto, b Bit/s, B Byte/s)
-U h|b|k|m|g|H|B|K|M|G #总流量显示单位
devices #指定设备
#字段说明
Curr #当前流量
Avg #平均流量
Min #最小流量
Max #最大流量
Ttl #总流量
#界面交互
上下方向键、左右方向键、enter键或者tab键都就可以切换查看多个网卡的流量情况
按 F2 显示选项窗口
按 q 或者 Ctrl+C 退出 nload
#查看所有网络设备进出流量,第一页显于一个设备
[root@ubuntu ~]# nload
#一屏显示所有设备流量
[root@ubuntu ~]# nload -m
#显示指定设备流量
[root@ubuntu ~]# nload ens160
#1000 毫秒刷新一次数据
[root@ubuntu ~]# nload -t 1000 ens160
16、查看进程网络带宽的使用情况 nethogs
NetHogs是一个开源的命令行工具(类似于Linux的top命令),用来按进程或程序实时统计网络带宽使用率。
nethogs [-h] [-V] [-d] [-v] [-t] [-c] [-p] [-s] [device(s)]
#常用选项
-d #数据刷新时间间隔,默认1秒
-v #显示单位(0 KB/s|1 total KB|2 total B|3 total MB)
-t #跟踪显示
-s #按发送数据量排序
-a #显示所有设备数据,包含回环设备
device #指定设备
#交互命令
q #退出
s #根据发送数据量排序
r #根据接收数据量排序
m #切换显示单位
#默认
[root@ubuntu ~]# nethogs
#显示指定设备数据
[root@ubuntu ~]# nethogs ens160
17、网络监视工具iptraf-ng
iptraf-ng 是一个基于控制台的 Linux 网络监控工具,它通过交互式界面或命令行参数实时显示网络接口的 IP 流量信息,适用于网络故障排查、流量分析和性能监控。
iptraf-ng [options]
#常用选项
-i <iface> #指定网络设备,默认所有
-d <iface> #指定网络设备,显示详细信息
-s <iface> #指定网络设备,统计tcp和udp信息
-z <iface> #指定网络设备,统计数据包
-B #在后台执行
-f #清除所有锁和计数器
-t N #仅统计指定的时长,单位分钏
-L <logfile> #指定日志文件
18、系统资源统计dstat
dstat由pcp-system-tools包提供,但安装dstat包即可, 可用于代替 vmstat,iostat功能。
dstat [-afv] [options...] [delay [count]]
#常用选项
-c|--cpu #显示cpu相关信息
-C 0,3,total #指定显示项,cpu0,cpu3和总计
-d|--disk #显示磁盘信息
-D total,sda #指定显示项,sda和总计
--dm|--device-mapper #显示设备映射信息
--part|--partition #显示分区信息
-P total,sdb2 #显示指定分区信息
-g|--page #显示page相关统计数据
-m|--mem #显示memory相关统计数据
-n|--net #显示network相关统计数据
-N eth1,total #指定网络设备
-p|--proc #显示process相关统计数据
-r|--io #显示io相关统计数据
-s|--swap #统计swap信息
-S swap1,total #指定swap
--socket #显示所有socket信息
--tcp #显示所有tcp信息
--udp #显示所有udp信息
--vm #显示vm统计信息
--vm-adv #显示高级vm统计信息
--list #列出所有可用插件
--pluginName #启用插件
-o file|--output=file #将统计信息写到指定文件
-top-cpu #显示最占用CPU的进程
-top-io #显示最占用io的进程
-top-mem #显示最占用内存的进程
-top-latency #显示延迟最大的进程
19、综合监控工具glances
Glances 是一个开源的跨平台系统监控工具,它使用 Python 编写,通过 curses 或基于 Web 的界面,在最小空间内展示最大的信息量。该工具能够实时监控系统的各种性能指标,如 CPU 使用率、内存消耗、磁盘活动、网络利用率等,并支持容器监控和远程监控功能。
glances [OPTIONS]
#常用选项
-b #以Byte为单位显示网卡数据速率
-d #关闭磁盘I/O模块
-f file #设定输入文件位置
-o {HTML|CSV} #输出格式
-m #禁用mount模块
-n #禁用网络模块
-t N #延迟时间间隔
-1 #每个CPU的相关数据单独显示
#内部命令
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
y Show/hide hddtemp stats
#glances 运行于C/S模式
#服务端配置
glances -s -B IPADDR #指明监听在哪个IP上,默认端口为 tcp 61209
#客户端配置
glances -c IPADDR #连接指定的IP
[root@ubuntu ~]# glances -c 10.0.0.157
20、查看进程打开文件lsof
lsof:list open files,查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符。
lsof [options...] [names]
#常用选项
-c cmd #列出指定进程所打开的文件
-g #列出GID号进程详情
+d dir #列出目录下被打开的文件
+D dir #递归列出目录下被打开的文件
-n dir #列出使用NFS的文件
-i condition #列出符合条件的进程
-p pid #列出指定进程号所打开的文件
-u #列出UID号进程详情
-n #不反向解析网络名字
#列出所有打开文件
[root@ubuntu ~]# lsof | head
#查看当前哪个进程正在使用此文件
[root@ubuntu-158 ~]#lsof /var/log/syslog
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1333 syslog 7w REG 252,0 2710328 3670089 /var/log/syslog
#查看指定终端启动的进程
[root@ubuntu ~]# lsof /dev/pts/1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
[root@ubuntu-158 ~]#lsof /dev/pts/1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 3681 root 0u CHR 136,1 0t0 4 /dev/pts/1
bash 3681 root 1u CHR 136,1 0t0 4 /dev/pts/1
bash 3681 root 2u CHR 136,1 0t0 4 /dev/pts/1
[root@ubuntu ~]# lsof `tty`
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 5246 root 0u CHR 136,4 0t0 7 /dev/pts/4
bash 5246 root 1u CHR 136,4 0t0 7 /dev/pts/4
bash 5246 root 2u CHR 136,4 0t0 7 /dev/pts/4
#查看指定进程打开的文件
[root@ubuntu ~]# lsof -p 1270
#查看指定程序打开的文件
[root@ubuntu ~]# lsof -c httpd
#查看指定用户打开的文件
[root@ubuntu ~]# lsof -u root | more
#查看指定目录下被打开的文件,参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文件
[root@ubuntu ~]# lsof +D /var/log/
[root@ubuntu ~]# lsof +d /var/log/
#查看所有网络连接,通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例
如:sshd等。也可以通过指定ip查看该ip的网络连接情况
[root@ubuntu ~]# lsof -i –n
[root@ubuntu ~]# lsof -i@127.0.0.1
#查看端口连接情况,通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
[root@ubuntu ~]# lsof -i :80 -n
#查看指定进程打开的网络连接,参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程
[root@ubuntu ~]# lsof -i –n -a -p 9527
#查看指定状态的网络连接,-n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等
[root@ubuntu ~]# lsof -n -P -i TCP -s TCP:ESTABLISHED
#从内存中恢复己删除的文件
[root@ubuntu-158 hu]#cp /var/log/syslog ./
[root@ubuntu-158 hu]#tail -f syslog
2025-10-03T12:00:03.190581+00:00 ubuntu-158 systemd[1]: Finished sysstat-collect.service - system activity accounting tool.
#查看进程
[root@ubuntu-158 ~]#ps aux | grep syslog
message+ 1203 0.0 0.3 9668 5660 ? Ss 02:08 0:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
syslog 1333 0.0 0.2 220672 4372 ? Ssl 02:08 0:00 /usr/sbin/rsyslogd -n -iNONE
root 9703 0.0 0.1 5796 2060 pts/1 S+ 12:21 0:00 tail -f syslog
root 9707 0.0 0.1 6764 2464 pts/0 S+ 12:22 0:00 grep --color=auto syslog
#查看内存映射
[root@ubuntu-158 ~]#ll /proc/9703/fd
total 0
dr-x------ 2 root root 5 Oct 3 12:22 ./
dr-xr-xr-x 9 root root 0 Oct 3 12:22 ../
lrwx------ 1 root root 64 Oct 3 12:22 0 -> /dev/pts/1
lrwx------ 1 root root 64 Oct 3 12:22 1 -> /dev/pts/1
lrwx------ 1 root root 64 Oct 3 12:22 2 -> /dev/pts/1
lr-x------ 1 root root 64 Oct 3 12:22 3 -> /root/hu/syslog
lr-x------ 1 root root 64 Oct 3 12:22 4 -> anon_inode:inotify
[root@ubuntu-158 ~]#rm -rf /root/hu/syslog
[root@ubuntu-158 ~]#ll /proc/9703/fd/
0 1 2 3 4
[root@ubuntu-158 ~]#ll /proc/9703/fd/3
lr-x------ 1 root root 64 Oct 3 12:22 /proc/9703/fd/3 -> '/root/hu/syslog (deleted)'
[root@ubuntu-158 ~]#cat /proc/9703/fd/3
[root@ubuntu-158 ~]#cat /proc/9703/fd/3 > syslog.1
[root@ubuntu-158 ~]#ll syslog.2
-rw-r--r-- 1 root root 2710094 Oct 3 12:17 syslog.2
21、CentOS 8 新特性 cockpit
Cockpit 是CentOS 8 取入的新特性,是一个基于 Web 界面的应用,它提供了对系统的图形化管理,由cockpit包提供,当前Ubuntu和CentOS7也支持此工具。
#安装
yum install -y cockpit
#启动
systemctl enable --now cockpit.socket
#访问
10.0.0.153:9090 #IP:9090


22、信号发送kill
kill:内部命令,可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写。
kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name...
kill -l [number] | -L
#常用选项
-SIGNAL #信号名称
-s #指定信号
-u uid #effective user,生效者
-U uid #real user,真正发起运行命令者
-t terminal #与指定终端相关的进程
-l|-L #显示信号名(pgrep可用),不跟进程则列出所有信号
-a #显示完整格式的进程名(pgrep可用)
-P pid #显示指定进程的子进程
#按PID向进程发送信号
kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
#范例
kill -1 pid …
kill -n 9 pid
kill -s SIGINT pid
#按程序名发送信号
killall [-SIGNAL] comm…
#范例
killall nginx
#按模式发送信号
pkill [options] pattern
指定信号的方式:
1. 使用信号的数字标识, 如 1,2,3
2. 使用信号的完整名称,不区分大小写, 如 SIGHUP, sighup
3. 使用信号的简写名称,不区分大小写,如 HUP,hup
#显示所有信号
[root@rocky8-153 ~]#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 相当于ctrl+\
9) SIGKILL 强制杀死正在运行的进程,可能会导致数据丢失,慎用!
15) SIGTERM 终止正在运行的进程,默认信号
18) SIGCONT 继续运行
19) SIGSTOP 后台休眠
[root@rocky8-153 ~]#ps aux | grep nginx
root 11754 0.0 0.1 103480 2164 ? Ss 21:09 0:00 nginx: master process /usr/sbin/nginx
nginx 11755 0.0 0.4 124880 7800 ? S 21:09 0:00 nginx: worker process
nginx 11756 0.0 0.4 124880 7800 ? S 21:09 0:00 nginx: worker process
root 11758 0.0 0.0 222012 1080 pts/0 S+ 21:09 0:00 grep --color=auto nginx
[root@rocky8-153 ~]#kill -9 11755
[root@rocky8-153 ~]#ps aux | grep nginx
root 11754 0.0 0.1 103480 2164 ? Ss 21:09 0:00 nginx: master process /usr/sbin/nginx
nginx 11756 0.0 0.4 124880 7800 ? S 21:09 0:00 nginx: worker process
nginx 11761 0.0 0.4 124880 7800 ? S 21:09 0:00 nginx: worker process
root 11763 0.0 0.0 222012 1092 pts/0 S+ 21:09 0:00 grep --color=auto nginx
[root@rocky8-153 ~]#ping 127.1
PING 127.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=2.71 ms
...
Killed
[root@rocky8-153 ~]#kill -9 11810
[root@rocky8-153 ~]#ps aux | grep ping
root 11818 0.0 0.0 222012 1112 pts/0 S+ 21:11 0:00 grep --color=auto ping
[root@rocky8-153 ~]#ps aux | grep nginx
root 11754 0.0 0.1 103480 2164 ? Ss 21:09 0:00 nginx: master process /usr/sbin/nginx
nginx 11756 0.0 0.4 124880 7800 ? S 21:09 0:00 nginx: worker process
nginx 11761 0.0 0.4 124880 7800 ? S 21:09 0:00 nginx: worker process
root 11830 0.0 0.0 222012 1112 pts/0 S+ 21:12 0:00 grep --color=auto nginx
[root@rocky8-153 ~]#killall -9 nginx
[root@rocky8-153 ~]#ps aux | grep nginx
root 11836 0.0 0.0 222012 1108 pts/0 S+ 21:12 0:00 grep --color=auto nginx
#利用 0 信号实现进程的健康性检查
#此方式有局限性,即使进程处于停止或僵尸状态,此方式仍然认为是进程是健康的
[root@ubuntu ~]# killall -0 ping
[root@ubuntu ~]# echo $?
0
[root@ubuntu ~]# killall -0 ping
ping: no process found
[root@ubuntu ~]# echo $?
1
#踢出指定终端,高版本内核无效
pkill -t pts/1
#pkill 和 pgrep支持正则表达式
[root@ubuntu ~]# pgrep -a '^p'
#关掉指定端口进程
[root@rocky8-153 ~]#ps aux | grep nginx
root 11892 0.0 0.1 103480 2172 ? Ss 21:16 0:00 nginx: master process /usr/sbin/nginx
nginx 11893 0.0 0.4 124880 8036 ? S 21:16 0:00 nginx: worker process
nginx 11894 0.0 0.4 124880 8036 ? S 21:16 0:00 nginx: worker process
root 11896 0.0 0.0 222012 1048 pts/0 S+ 21:17 0:00 grep --color=auto nginx
[root@rocky8-153 ~]#ss -tnlp | grep nginx
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=11894,fd=6),("nginx",pid=11893,fd=6),("nginx",pid=11892,fd=6))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=11894,fd=7),("nginx",pid=11893,fd=7),("nginx",pid=11892,fd=7))
[root@rocky8-153 ~]#fuser -k 9 80/tcp
Specified filename 9 does not exist.
80/tcp: 11892 11893 11894
22、作业管理
前台作业:通过终端启动,且启动后一直占据终端
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台:
运行中的作业: Ctrl+z
尚未启动的作业: COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系。
nohup COMMAND &>/dev/null &
screen;COMMAND
tmux;COMMAND#作业控制 fg [[%]JOB_NUM] #把指定的后台作业调回前台 bg [[%]JOB_NUM] #让送往后台的作业在后台继续运行 kill [%JOB_NUM] #终止指定的作业
#Ctrl+z 使占据终端的进程暂停,让出终端
[root@rocky8-153 ~]#ping www.baidu.com
PING www.a.shifen.com (220.181.111.232) 56(84) bytes of data.
64 bytes from 220.181.111.232 (220.181.111.232): icmp_seq=1 ttl=128 time=9.04 ms
64 bytes from 220.181.111.232 (220.181.111.232): icmp_seq=2 ttl=128 time=11.9 ms
^Z
[1]+ Stopped ping www.baidu.com
#进程变成stop态
[root@rocky8-153 ~]#ps aux | grep ping
root 12012 0.0 0.2 265188 5148 pts/0 T 21:29 0:00 ping www.baidu.com
root 12018 0.0 0.0 222012 1136 pts/0 S+ 21:29 0:00 grep --color=auto ping
#查看当前终端所有作业
[root@rocky8-153 ~]#jobs
[1]+ Stopped ping www.baidu.com
#作业控制,调出后台进程
[root@rocky8-153 ~]#fg 1
ping www.baidu.com
64 bytes from 220.181.111.232 (220.181.111.232): icmp_seq=3 ttl=128 time=151 ms
64 bytes from 220.181.111.232 (220.181.111.232): icmp_seq=4 ttl=128 time=107 ms
...
#让后台stop进程继续运行
[root@rocky8-153 ~]#bg
[1]+ ping www.baidu.com &
[root@rocky8-153 ~]#64 bytes from 110.242.69.21 (110.242.69.21): icmp_seq=3 ttl=128 time=56.2 ms
64 bytes from 110.242.69.21 (110.242.69.21): icmp_seq=4 ttl=128 time=38.5 ms
...
killall -9 ping
#注意命令有标准输入输出要打到/dev/null不然会显示在终端
23、并行运行
利用后台执行,实现并行功能,即同时运行多个进程,提高效率。
方法1
cat all.sh
./f1.sh&
./f2.sh&
./f3.sh&
wait
方法2
./f1.sh&./f2.sh&./f3.sh&
wait
[root@ubuntu-158 102]#cat a.sh
#!/bin/bash
echo "---a-start---"
sleep 1
echo "---a-end-----"
[root@ubuntu-158 102]#cat b.sh
#!/bin/bash
echo "---b-start---"
sleep 2
echo "---b-end-----"
[root@ubuntu-158 102]#cat c.sh
#!/bin/bash
echo "---c-start---"
sleep 3
echo "---c-end-----"
#循序执行
[root@ubuntu-158 102]#cat tot.sh
#!/bin/bash
./a.sh
./b.sh
./c.sh
[root@ubuntu-158 102]#time ./tot.sh
---a-start---
---a-end-----
---b-start---
---b-end-----
---c-start---
---c-end-----
real 0m6.048s
user 0m0.013s
sys 0m0.028s
#并行执行
[root@ubuntu-158 102]#cat tot.sh
#!/bin/bash
./a.sh&
./b.sh&
./c.sh&
wait
[root@ubuntu-158 102]#time ./tot.sh
---a-start---
---b-start---
---c-start---
---a-end-----
---b-end-----
---c-end-----
real 0m3.020s
user 0m0.015s
sys 0m0.016s
#网段检测
#!/bin/bash
#顺序执行
net=172.16.1
for i in {1..254};do
ping -c1 -W1 $net.$i &> /dev/null && echo $net.$i is up || echo $net.$i
is down
done
#并发执行
net=172.16.1
for i in {1..254};do
{
ping -c1 -W1 $net.$i &> /dev/null && echo $net.$i is up || echo $net.$i
is down
}&
done
wait
二、计划任务
计划任务在Linux系统中是一项非常重要的功能,它允许用户预设在特定时间或间隔执行指定的命令或脚本,极大地提升了系统管理的自动化水平。
| 任务类型 | 说明 | 实现程序 |
| 一次性任务 | 未来的某时间点执行一次的任务 | at,batch |
| 周期性任务 | 根据条件周期性执行 | cron |
#准备工作
#rocky
[root@localhost ~]# yum -y install postfix
[root@localhost ~]# systemctl enable --now postfix
#ubuntu
[root@ubuntu ~]# apt install mailutils
分钟(0 - 59):表示任务在每小时的第几分钟执行。
小时(0 - 23):表示任务在每天的第几小时执行。
日期(1 - 31):表示任务在每月的第几日执行。
月份(1 - 12):表示任务在每年的第几月执行。
星期几(0 - 6,0表示星期日):表示任务在每周的第几天执行。
# * 表示匹配该字段的所有可能值
* * * * * #每分钟执行一次 1 2 * * * #每天第2时第1分执行一次# , 表示该位置上多个值
1,3,5 2,4,6 * * * #表示第2,4,6 这三个小时中每个小时的第1,3,5 分的时候执行一次 0 1,13 * * * command #表示每天的 1 点 0 分和 13 点 0 分执行# - 表示范围取值
1-5 2-6 * * * #表示第2到第6小时,第1到第5分每分钟执行一次 0 9-17 * * 1-5 #表示在每周一到周五的 9 点到 17 点之间的每个整点执行# / 表示频率,步长
*/5 */6 * * * #表示每6小时,在该小时内,每5分钟执行一次# 综合用法
*/5 1,3,5-8 * * 2,4 #每周2和每周4的第1时,第3时,第5到8时,每5分钟执行一次 1 2 1-10 * 1-5 #每月的第1到10日,或每周1到周五的2时1分执行一次 1-30/5 * * * * #每小时1-30分内,每5分钟执行一次#特定关健字
@yearly #每年1月1日执行一次,相当于 0 0 1 1 * @annually #每年1月1日执行一次,相当于 0 0 1 1 * @monthly #每月1日执行一次,相当于 0 0 1 * * @weekly #每周日执行一次,相当于 0 0 * * 0 @daily #每天0时执行一次,相当于 0 0 * * * @hourly #每小时0分执行一次,相当于 0 * * * * @reboot #重启后执行一次
1、一次性任务
at 工具,由包 at 提供,依赖于atd服务,需要启动才能实现at任务。
at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下。
执行任务时PATH变量的值和当前定义任务的用户身份一致。
作业执行命令的结果中的标准输出和错误以执行任务的用户身份发邮件通知给 root 。
at [option] TIME
#常用选项
-V #显示版本信息
-t time #时间格式[[CC]YY]MMDDhhmm[.ss]
-l #列出指定队列中等待运行的作业;相当于atq
-d N #删除指定的N号作业;相当于atrm
-c N #查看具体作业N号任务
-f file #指定的文件中读取任务
-m #当任务被完成之后,将给用户发送邮件,即使没有标准输出
#TIME-定义出什么时候进行 at 这项任务的时间
#HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00
#HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2016-09-20
#HH:MM[am|pm] [Month] [Date]
06pm March 17
17:20 tomorrow
#用具本名词表示时间
noon #正午,中午12点
midnight #午夜,晚上12点
teatime #下午茶时间,下午4点
tomorrow #明天
now #当前时间
#HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该项任务
now + 5 min
02pm + 3 days
#交互式创建
#添加今天11:09定时任务
[root@ubuntu-158 ~]#at 11:09
warning: commands will be executed using /bin/sh
at Sat Oct 4 11:09:00 2025
at> touch /tmp/at-1109
at> echo "at success"
at> <EOT>
job 5 at Sat Oct 4 11:09:00 2025
#列出任务
[root@ubuntu-158 ~]#at -l
5 Sat Oct 4 11:09:00 2025 a root
#查看具体任务
[root@ubuntu-158 ~]#at -c 5
#查看还没有执行的任务-脚本文件
[root@ubuntu-158 ~]#ls -l /var/spool/cron/atjobs/
total 4
-rwx------ 1 root daemon 3341 Oct 4 11:07 a0000501bf79dd
#查看文件就是上面输入的内容
[root@ubuntu-158 ~]#cat /var/spool/cron/atjobs/a0000501bf79dd
[root@ubuntu-158 ~]#file /var/spool/cron/atjobs/a0000501bf79dd
#到时间查看执行结果
[root@ubuntu-158 ~]#ll /tmp
total 8
-rw-r--r-- 1 root root 0 Oct 4 11:09 at-1109
...
#输出内容在邮件里面
[root@ubuntu-158 ~]#mail
"/var/mail/root": 1 message 1 new
>N 1 root Sat Oct 4 11:09 12/381 Output from your job 5
? 1
Return-Path: <root@ubuntu-158>
X-Original-To: root
Delivered-To: root@ubuntu-158
Received: by ubuntu-158 (Postfix, from userid 0)
id 0B5C2381138; Sat, 04 Oct 2025 03:09:00 +0000 (UTC)
Subject: Output from your job 5
To: root@ubuntu-158
Message-Id: <20251004030900.0B5C2381138@ubuntu-158>
Date: Sat, 04 Oct 2025 03:09:00 +0000 (UTC)
From: root <root@ubuntu-158>
at success
#原来生成的任务文件执行结束后自动删除
[root@ubuntu-158 ~]#ls -l /var/spool/cron/atjobs/
total 0
#输入重定向
#创建
[root@ubuntu-158 ~]#echo reboot | at now+5min
warning: commands will be executed using /bin/sh
job 6 at Sat Oct 4 11:15:00 2025
#查看
[root@ubuntu-158 ~]#at -l
6 Sat Oct 4 11:15:00 2025 a root
#删除
[root@ubuntu ~]# at -d 11
[root@ubuntu ~]# at -l
[root@ubuntu ~]#
定时任务一般都是要在将来的某个时间去执行,然后标准输出以及错误输出都不会写输出到终端,这是因为,在任务执行的时候,当前终端没有连接上来,或者不是创建任务的用户。
2、周期性任务计划cron
cron 服务相关程序:
⚪cronie:主程序包,提供crond守护进程及相关辅助工具。
⚪crontabs:包含CentOS提供系统维护任务。
⚪cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如:cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务。#cron 依赖于crond服务,确保crond守护处于运行状态 #CentOS 7 以后版本 systemctl status crond #CentOS 6 service crond status#cron 程序日志文件 [root@rocky-151 ~]#ll /var/log/cron -rw------- 1 root root 23238 Oct 4 13:01 /var/log/cron ##ubuntu 中的crontab 任务日志放在 /var/log/syslog 中 #查看帮助 man 5 crontab
cron任务分为系统级任务和用户级任务
⚪系统cron任务
操作系统自带的cron 任务,系统维护作业,/etc/crontab 主配置文件, /etc/cron.d/ 子配置文件。⚪用户cron任务
每个用户自己名下的 cron 任务,红帽系统保存在 /var/spool/cron/USERNAME,Ubuntu 系统存放在/var/spool/cron/crontabs/USERNAME,利用 crontab 命令管理。
① 系统cron计划任务
系统cron任务是操作系统自己调用的任务,与用户无关,如果想添加系统级的cron任务,写在此文件中。
[root@ubuntu-158 ~]#cat /etc/cron cron.d/ cron.hourly/ crontab cron.yearly/ cron.daily/ cron.monthly/ cron.weekly/ #系统cron 任务相关文件 /etc/crontab #配置文件 /etc/cron.d/ #配置文件 /etc/cron.hourly/ #脚本 /etc/cron.daily/ #脚本 /etc/cron.weekly/ #脚本 /etc/cron.monthly/ #脚本
[root@ubuntu-158 ~]#cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
# You can also override PATH, but by default, newer versions inherit it from the environment
#PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.daily; }
47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; }
52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; }
#
② 用户计划任务
crontab命令:
⚪每个用户都有专用的cron任务文件:/var/spool/cron/crontabs/USERNAME。
⚪默认标准输出和错误会被发邮件给对应的用户,如:hu创建的任务就发送至hu的邮箱。
⚪root能够修改其它用户的作业。
⚪用户的cron中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path或者加入到计划任务执行的脚本中。
⚪第六个字段指定要运行的命令。 该行的整个命令部分,直至换行符或“%”字符,指定的shell执行,除非使用反斜杠(\)进行转义,否则该命令中的“%”字符将变为换行符,并且第一个%之后的所有数据将作为标准输入发送到该命令。⚪cron 任务中的标准输入输出会发送邮件到用户邮箱,如果不想有邮件,则可以在定时任务中加上重定向。
crontab [-u user] [-l | -r | -e] [-i]
#常用选项
-l #列出所有任务
-e #编辑任务
-r #移除所有任务
-i #同-r一同使用,以交互式模式移除指定任务
-u user #管理特定用户的cron, 仅root有权限操作
#查看cron任务
[root@ubuntu ~]# crontab -l
no crontab for root
#root 用户可以查看指定用户的 crontab
[root@ubuntu ~]# crontab -u hu -l
no crontab for hu
[root@rocky86 ~]$ crontab -l
no crontab for root
#普通用户只能查看自己名下的 crontab
[hu@rocky86 ~]$ crontab -u hu -l
must be privileged to use -u
#修改默认配置文件
#Ubuntu首次编辑会提示选择编辑工具 2
[root@ubuntu-158 ~]#crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run select-editor again.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]: 2
crontab: installing new crontab
[root@ubuntu-158 ~]#crontab -l
* * * * * touch /tmp/`date +\%F-\%T`
[root@ubuntu-158 ~]#ls /tmp
2025-10-04-14:00:01
2025-10-04-14:01:01
2025-10-04-14:02:01
2025-10-04-14:03:01
...
cron中的环境变量
cron中的环境变量和bash 中的环境变量不一致,因此会导致定时任务脚本文件中的命令执行失败,所以在写 cron 任务时,命令路径要求写全路径,或先在首部先定义PATH。
#获取rocky中cron中的PATH
[root@rocky8-153 tmp]#crontab -l
* * * * * echo $PATH >> /tmp/test-Path
[root@rocky8-153 tmp]#cat test-Path
/usr/bin:/bin
[root@rocky8-153 tmp]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#解决
#自定义PATH
#方法1
[root@rocky8-153 tmp]#crontab -e
crontab: installing new crontab
[root@rocky8-153 tmp]#crontab -l
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
* * * * * echo $PATH >> /tmp/test-Path
[root@rocky8-153 tmp]#cat test-Path
/usr/bin:/bin
...
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
#方法2
#将命令的绝对路径写全
[root@rocky8-153 tmp]#crontab -l
* * * * * /usr/bin/echo $PATH >> /tmp/test-Path
#查看日志
cat /var/log/cron
#ubuntu
cat /var/log/syslog
#交互式删除
[root@ubuntu ~]# crontab -l
* * * * * echo "this is test cron from root"
* * * * * echo "this is test cron222 from root" &>/dev/null
[root@ubuntu ~]# crontab -ir
crontab: really delete root's crontab? (y/n) y
[root@ubuntu ~]# cr
#重定向创建
[root@ubuntu ~]# crontab -l
no crontab for root
[root@ubuntu ~]# echo @reboot echo "this is test msg" | crontab
[root@ubuntu ~]# crontab -l
@reboot echo this is test msg
③ cron 补充
cron 中 % 的用法
cron任务中不建议使用%,它有特殊用途,它表示换行的特殊意义,且第一个%后的所有字符串会被将成当作命令的标准输入,如果在命令中要使用%,则需要用 \ 转义。
注意:将%放置于单引号中是不支持的30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T` 30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` #错误写法
控制用户执行计划任务
/etc/cron.{allow,deny} #ubuntu中无此文件
#秒级别运行任务
#用cron 执行脚本,在脚本中写循环还来实现
[root@ubuntu ~]# crontab -l
5 1 * * * /root/cron-test.sh
[root@ubuntu ~]# cat cron-test.sh
#!/bin/bash
PATH=/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
for i in {1..60};do
if [ $[$i%5] -eq 0 ];then
echo `date` >> /tmp/cron-sh-test.log
fi
sleep 1
done



1401

被折叠的 条评论
为什么被折叠?



