彭于晏一个月带你玩转Linux操作系统10
Linux 计划任务管理
一次性计划任务
一次性计划任务是指在未来某个时间点执行一个命令或一系列命令。
atd 服务
Linux 系统中at提供一次性计划任务功能。
at不是一个单独的工具,包括系统后台进程(atd)和一系列与后台进程atd交互的命令(例如at atq等等)。
# 使用以下命令安装
[root@centos7 ~]# yum install at
# 确认atd服务开机启动
[root@centos7 ~]# systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-12-21 16:54:08 CST; 3min 22s ago
Main PID: 1184 (atd)
Tasks: 1
CGroup: /system.slice/atd.service
└─1184 /usr/sbin/atd -f
Dec 21 16:54:08 centos7.linux.com systemd[1]: Started Job spooling tools.
at 命令
作用:在指定时间执行一次性任务的命令,适合那些只需要执行一次的任务
语法:at [选项] 时间
时间格式说明:
| 写法 | 含义 | 示例 |
|---|---|---|
| HH:MM | 今天/明天的指定时间 | at 14:30 |
| HH:MM YYYY-MM-DD | 指定日期和时间 | at 14:30 2026-08-07 |
| now + N minutes | N 分钟后 | at now + 10 minutes |
| now + N hours | N 小时后 | at now + 2 hours |
| now + N days | N 天后 | at now + 3 days |
| midnight | 明天 00:00 | at midnight |
| noon | 今天 12:00 | at noon |
| teatime | 今天 16:00 | at teatime |
| tomorrow | 明天同一时间 | at tomorrow 10:00 |
at命令从标准输入中读取要执行的命令。手动输入命令时,按ctrl+D完成输入。
示例:
[root@centos7 ~]# at now +5 minutes
at> echo hello world > /tmp/hello.log
at> <EOT>
job 1 at Wed Dec 21 17:09:00 2022
输入完成,按ctrl+d完成。上面的字符’',就是按ctrl+d 自动出现的。
如果输入错误,使用ctrl+backspace删除。
at -f
对于大量的命令或者错字敏感的命令,可以通过重定向和-f选项从脚本中读取,例如:
[root@centos7 ~]# vim myscript.sh
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
[root@centos7 ~]# at now +5 minutes < myscript.sh
job 2 at Wed Dec 21 17:10:00 2022
[root@centos7 ~]# at now +100 minutes -f myscript.sh
job 3 at Wed Dec 21 18:46:00 2022
timespec允许多种时间组合。例如,02:00 pm,15:43,或者teatime,后接日期或未来的天数。
示例:
- now +5 hours
- teatime tomorrow (teatime 16:00)
- noon +4 days(noon 12:00)
- 5 pm august 3 2016
时间定义参考文档 /usr/share/doc/at/timespec
at -l 或 atq
查看任务队列。
[root@centos7 ~]# at -l
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root
[root@centos7 ~]# atq
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root
at -q
atd提供26个队列,a到z,排的越后优先级越低。使用at命令使用-q选项指定队列。
[root@centos7 ~]# at -q b now +5 minutes < myscript.sh
job 4 at Wed Dec 21 17:11:00 2022
[root@centos7 ~]# atq
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root
4 Wed Dec 21 17:11:00 2022 b root
[root@centos7 ~]# at -l -q b
4 Wed Dec 21 17:11:00 2022 b root
# 时间到达后检测
[root@centos7 ~]# atq
3 Wed Dec 21 18:46:00 2022 a root
[root@centos7 ~]# cat /tmp/hello.log
hello world
[root@centos7 ~]# cat /tmp/myscript.log
Wed Dec 21 17:10:01 CST 2022
hello myscript
Wed Dec 21 17:11:00 CST 2022
hello myscript
at -c
查看任务详细信息。
[root@centos7 ~]# at -c 3
......
${SHELL:-/bin/sh} << 'marcinDELIMITER4bf95eea'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
marcinDELIMITER4bf95eea
at -d/-r 或 atrm
删除任务。
[root@centos7 ~]# atrm 3
[root@centos7 ~]# atq
限定用户
/etc/at.allow 和 /etc/at.deny 控制哪些人可以使用atd服务。
匹配规则如下:
- 如果 /etc/at.allow 文件存在,只有该文件中提到的用户可以使用at服务。
- 如果/etc/at.allow文件不存在,只有/etc/at.deny文件中提到的用户禁止使用at服务。
查看当前配置:允许所有用户使用at服务。
[root@centos7 ~]# ls /etc/at.*
/etc/at.deny
[root@centos7 ~]# cat /etc/at.deny
# 内容为空
用户周期性计划任务
周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。
crond 服务
Linux 系统中cron 提供周期性计划任务功能。
cron包括系统后台进程(crond)、crontab 命令和多个配置文件。
用户可以使用 crontab 命令管理自己的周期性作业。
如果cron job运行的命令没有重定向 stdout 和 stderr,crond进程将通过邮件发送给job所有者。
crontab 命令
作用:用于管理周期性定时任务,适合那些需要重复执行的任务。
语法:crontab [选项]
crontab -l
查看周期性计划任务。
[pengyuyan@centos7 ~]$ crontab -l
no crontab for pengyuyan
crontab -e
该命令默认使用vi编辑周期性计划任务:
- 可以申明环境变量,格式为name=value,将影响声明之后的所有行。crontab使用的常规环境变量有SHELL和MAILTO。发送邮件需要额外的配置:mail服务器和smtp。
- 空行是允许的。
- 以#开头的行是注释行。
- 每一行是一个job。
默认编辑器可以通过EDITOR环境变量设定。
每一个jobs包涵6个部分:五个时间和一个要执行的命令,按以下顺序显示:
- 分钟
- 小时
- 几号
- 月份
- 星期几
- 命令
前五个字段全部使用相同的语法规则:
*,表示“无关紧要”,始终。- 数字可用于指定分钟数或小时数、日期或者工作日。对于工作日,0表示星期日,1表示星期一,2表示星期二,依此类推。7也表示星期曰。
- x-y:表示范围:x到y(含)。
- x,y:表示列表。列表也可以包含范围,例如,
5,10-13,17表示作业应当在每小时过去5分钟、10分钟、11分钟、12分钟、13分钟和17分钟后运行。 - */x,表示x的时间间隔,例如列中的*/7表示每七分钟运行一次作业。
- 最后一个区域是要执行的命令,命令通过/bin/sh执行,除非指定SHELL变量。如果命令中包涵未转义字符%,则表示开启新行,并且%后面所有字符作为标准输入。
月和周区域可以使用三字母简写单词,Jan,Feb,Mar和Mon,Tue。
示例:
-
以下作业将在每年2月2日上午9点准点执行命令/usr/local/bin/yearly_backup。
0 9 2 2 * /usr/local/bin/yearly_backup -
以下作业将在七月每周五的上午9点和下午4点间,每五分钟向该作业的所有者发送包含单词Chime的电子邮件。
*/5 9-16 * Jul 5 echo "Chime" -
以下作业将在每个工作日午夜前的两分钟运行命/usr/local/bin/daily_report。
58 23 * * 1-5 /usr/local/bin/daily_report -
以下作业将在每个工作日(周一到周五)上午9点执行mutt命令,从而将邮件消息Checkingin发送给收件人boss@example.com。
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
示例:
[pengyuyan@centos7 ~]$ export EDITOR=vim
[pengyuyan@centos7 ~]$ crontab -e
*/2 2,6-23 * * * date >> /tmp/date.log
[pengyuyan@centos7 ~]$ crontab -l
*/2 2,3-23 * * * date >> /tmp/date.log
# 监控日志
[pengyuyan@centos7 ~]$ tail -f /tmp/date.log
2022年 12月 21日 星期三 21:02:01 CST
2022年 12月 21日 星期三 21:04:01 CST
......
crontab -r
删除所有周期性计划任务。
[pengyuyan@centos7 ~]$ crontab -r
[pengyuyan@centos7 ~]$ crontab -l
no crontab for laoma
crontab -u 用户名
root用户可以使用参数 -u username 管理其他用户周期性作业。
[root@centos7 ~]# crontab -u pengyuyan -e
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
[root@centos7 ~]# crontab -u pengyuyan -r
[root@centos7 ~]# crontab -u pengyuyan -l
no crontab for pengyuyan
crontab filename
还可以使用crontab filename 命令从文件 filename 中读取的作业并替换当前所有作业。
[pengyuyan@centos7 ~]$ vim mycron
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
[pengyuyan@centos7 ~]$ crontab mycron
[pengyuyan@centos7 ~]$ crontab -l
0 9 2 2 * /usr/local/bin/yearly_backup
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
练习
编写一个简单的脚本/usr/local/bin/myjob
- 脚本内容要求如下:
- 第一个命令 计算 /dev/zero md5值:md5sum /dev/zero &
- 第二个命令 休息20秒: sleep 20
- 第三个命令 kill掉之前 的md5程序。
- 11月份奇数号11-18点之间,每隔2分钟执行一次。
参考答案:
# 1.开发脚本
[root@server ~ 11:16:02]# vim /usr/local/bin/myjob
#!/bin/bash
md5sum /dev/zero &
sleep 20
pkill md5sum
[root@server ~ 11:18:23]# chmod +x /usr/local/bin/myjob
# 2. 配置定时任务
[root@server ~ 11:21:22]# crontab -e
[root@server ~ 11:22:35]# crontab -l
*/2 11-18 */2 11 * /usr/local/bin/myjob
# 3. 监视任务执行
journalctl -f 监视 cron 执行
top 监视 md5sum 程序运行和终止
系统周期性计划任务
系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业:
- /etc/crontab
- /etc/cron.d/ 目录
- /etc/anacrontab
/etc/crontab
crond的配置文件比crontab命令定义的jobs多一个区域,在最后一个时间和command之间,指明使用哪个账户执行job。
[root@centos7 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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
/etc/cron.d
系统周期性作业应始终在 /etc/cron.d/ 目录中创建自定义crontab文件,防止cronie更新后覆盖/etc/crontab文件。其他应用也会将系统周期性作业存放在该目录。
/etc/cron.d/0hourly定义了每小时要执行的任务: run-parts /etc/cron.hourly。
作用:每小时将 /etc/cron.hourly目录下所有脚本按顺序执行一次。
[root@centos7 ~]# ls /etc/cron.d
0hourly raid-check sysstat
[root@centos7 ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
/etc/anacrontab
在过去,/etc/anacrontab 由单独的一个进程anacron处理,在CentOS 7 及后续版本中,这个文件也由 crond 进程处理,目的是确保重要的工作总是被执行,即使系统关机或者其他重大事故。
/etc/anacrontab 定义了每天、每周、每个月要运行的任务。
周期性执行任务目录:
- 每天要执行的任务目录:/etc/cron.daily
- 每周要执行的任务目录:/etc/cron.weekly
- 每月要执行的任务目录:/etc/cron.monthly
[root@centos7 ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
/etc/anacrontab 使用语法 NAME=value 配置 anacrontab。
例如,START_HOURS_RANGE=3-22,作业只能在此时间段运行。
/etc/anacrontab 每行包涵4个区域:
- period in days,按重复计划运行的作业的间隔天数。该字段接受整数或宏作为值。例如,宏@daily相当于整数1,它表示每天执行该作业。同样,宏@weekly相当于整数7,它表示每周执行该作业。
- delay in minutes,在启动该作业前,crond守护进程应等待的时间。
- job-identifier,此为/var/spool/anacron中的文件名称,用于检查该作业是否已运行。
- command,要执行的命令。
Linux 进程调度管理
进程调度器
现代计算机系统中既包含只有单个CPU且任何时候都只能处理单个指令的低端系统到具有几百个cpu、每个cpu有多个核心的高性能超级计算机,可以并行执行几百个指令。所有这些系统都有一个共同点:系统进程线程数量超出了CPU数量。
Linux系统看起来可以同时执行多个进程,多个进程轮流使用CPU。内核使用进程调度器决定如何分配CPU时间。为了更好地运行,进程调度器必须平衡不同的条件,快速决定下个执行的进程,确保进程获得公平的CPU时间:
- 按时间片轮转(10-20ms为1个时间片 )
- 按优先级调度,允许高优先级进程获取更多的共享CPU时间,低优先级进程获取更少的共享CPU时间。

进程调度器可粗略分为两类:
- 实时调度器,系统中重要的进程由实时调度器调度,获得CPU能力强。
- 非实时调度器,系统中大部分进程由非实时调度器调度,获得CPU能力弱。
实时调度器
实时调度器支持的调度策略:
- SCHED_RR,roundrobin 轮询调度策略。相同优先级的进程轮流获取相同的CPU时间。
- SCHED_FIFO,先入先出调度策略。被分配到的CPU时间的进程会一直运行,直到被IO阻塞(也称为sched_yield),会被高优先级进程抢占。
实时调度器管理的进程运行优先级范围如下:

即使系统运行实时调度程序,也要保持可响应状态,至少ssh可用。
管理员可以使用以下两个sysctl参数,阻止实时调度策略下运行的程序占用所有CPU时间:
-
kernel.sched_rt_runtime_us,在kernel.sched_rt_period_us内实时态进程可使用的共享CPU时间,默认值950000,也就是0.95秒。设置为0,实时调度进程将无法获取CPU时间。
-
kernel.sched_rt_period_us,CPU分配的周期时间,单位us,默认值1000000,也就是1秒。
从kernel.sched_rt_period_us 中减去 kernel.sched_rt_runtime_us 后的剩余时间交给非实时调度器SCHED_NORMAL调度。
-
kernel.sched_rr_timeslice_ms,在SCHED_RR调度下的进程每次轮询获取的CPU时间,单位ms,默认值100,也就是0.1秒,有效范围1-100。
非实时调度器
非实时调度器支持的调度策略:
- SCHED_NORMAL,标准的轮询方式时间共享调度,也称为SCHED_OTHER。
- SCHED_BATCH,针对批量方式执行的进程策略。不像 SCHED_NORMAL 频繁竞争,任务可以长时间运行。
- SCHED_IDLE,用于执行非常低的优先级应用。使用 SCHED_IDLE 调度策略运行的进程比nice 19运行的进程优先级还低。
管理进程优先级
非实时调度策略
nice 值
常规系统上运行的大多数进程都使用 SCHED_OTHER 调度策略。由于并非所有进程都同等重要,因此可以为使用SCHED_OTHER调度策略运行的程序指定相对优先级,称为nice值。
有40种不同级别的nice值,范围 -20(最高优先级)到 19(最低优先级):
- nice 值越高,代表优先级越低,获取CPU能力越弱。
- nice 值越低,代表优先级越高,获取CPU能力越强。
注意: 当不存在CPU资源竞争时,即使nice值高的进程也可以获得足够CPU资源。
nice 值查看
top 命令

- PID: 进程 ID
- USER: 进程所有者
- PR: 优先级(数值越小优先级越高)
- NI:nice 值(-20 最高,19 最低)
- VIRT: 虚拟内存大小(KB)
- RES:物理内存大小(KB)
- SHR: 共享内存大小(KB)
- S: 进程状态(R=运行,S=睡眠,D=不可中断,Z=僵尸)
- %CPU: CPU 使用率
- %MEM: 内存使用率
- TIME+:累计 CPU 时间(精确到 1/100 秒)
ps命令
作用:查看当前系统进程状态,可以看到哪些程序在运行、占用了多少资源、运行了多久。
语法:ps [选项]
常见命令:
| 命令 | 作用 | 适用场景 |
|---|---|---|
| ps aux | 显示所有进程的详细信息(BSD 风格) | 最常用,看所有进程的状态 |
| ps -ef | 显示所有进程的完整格式(UNIX 风格) | 查看进程的父进程 ID(PPID) |
| ps -eo | 自定义输出格式(显示系统所有的进程) | 只看你想看的字段(如 PID、命令、CPU 等) |
| ps -o | 自定义输出格式(显示当前终端的进程) | 只看你想看的字段(如 PID、命令、CPU 等) |
[pengyuyan@centos7 ~]$ ps -o nice,cmd $(pgrep systemd)
NI CMD
0 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
0 /usr/lib/systemd/systemd-journald
0 /usr/lib/systemd/systemd-udevd
0 /usr/lib/systemd/systemd-logind
默认情况下,子进程将继承父进程的nice值,通常为0。
[pengyuyan@centos7 ~]$ md5sum /dev/zero &
[1] 55725
[pengyuyan@centos7 ~]$ ps -o pid,nice,command $$ 55725
PID NI COMMAND
52751 0 -bash
55725 0 md5sum /dev/zero
# $$ 代表当前终端中运行的 shell 程序 PID
实时调度器进程优先级和非实时调度器进程优先级对比如下:

结论: 优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。
nice 命令
作用:用于以指定的优先级启动新进程的命令,它控制进程的nice 值,影响 CPU 给它分配的时间片。
语法:nice -n 优先级值 命令 [参数]
常用命令:
| 命令 | 作用 |
|---|---|
| nice -n 10 ./my_script.sh | 以 nice=10(较低优先级)运行脚本 |
| nice -n -5 ./my_script.sh | 以 nice=-5(较高优先级)运行脚本(需要 root) |
| nice ./my_script.sh | 以 nice=10(默认偏移)运行脚本 |
示例:
# nice值默认是10
[pengyuyan@centos7 ~]$ nice md5sum /dev/zero &
[1] 55742
[pengyuyan@centos7 ~]$ ps -o pid,nice,command
PID NI COMMAND
52751 0 -bash
55742 10 md5sum /dev/zero
55773 0 ps -o pid,nice,command
普通用户仅允许使用正数的nice值运行程序。
# 设置一个负数优先级
[pengyuyan@centos7 ~]$ nice -n -2 md5sum /dev/zero &
[2] 55782
[pengyuyan@centos7 ~]$ nice: cannot set niceness: Permission denied
[pengyuyan@centos7 ~]$ ps -o pid,nice,command 55782
PID NI COMMAND
55782 0 md5sum /dev/zero
# 设置一个正数优先级
[pengyuyan@centos7 ~]$ nice -n 2 md5sum /dev/zero &
[3] 55785
[pengyuyan@centos7 ~]$ ps -o pid,nice,command 55785
PID NI COMMAND
55785 2 md5sum /dev/zero
renice 命令
作用:用于修改已运行进程的 nice 值的命令
语法:renice -n 优先级值 -p PID
常用命令:
| 命令 | 作用 |
|---|---|
| renice -n 15 -p 12345 | 把 PID 12345 的 nice 改为 15(降低优先级) |
| sudo renice -n -5 -p 12345 | 把 PID 12345 的 nice 改为 -5(提高优先级,需 root) |
| renice -n 10 -u tony | 把用户 tony 的所有进程的 nice 改为 10 |
修改上面示例中产生的进程的优先级。
[pengyuyan@centos7 ~]$ renice -n 2 55782
55782 (process ID) old priority 0, new priority 2
[pengyuyan@centos7 ~]$ ps -o pid,nice,command 55782
PID NI COMMAND
55782 2 md5sum /dev/zero
普通用户只能升高进程nice值,不能降低!(降低需要root)
[pengyuyan@centos7 ~]$ renice -n -2 55782
renice: failed to set priority for 55782 (process ID): Permission denied
[pengyuyan@centos7 ~]$ ps -o pid,nice,command 55782
PID NI COMMAND
55782 2 md5sum /dev/zero
# 使用root用户调整
[root@centos7 ~]# renice -n -2 55782
55782 (process ID) old priority 2, new priority -2
[root@centos7 ~]# renice -n -2 55785
55785 (process ID) old priority 2, new priority -2
[pengyuyan@centos7 ~]$ ps -o pid,nice,command 55782 55785
PID NI COMMAND
55782 -2 md5sum /dev/zero
55785 -2 md5sum /dev/zero
top 命令
top 界面查看进程CPU使用率:55782和55785,CPU使用率非常接近,因为优先级一致。

在该界面中使用 r 指令设置进程nice值。
终止之前创建的3个md5sum进程。
[pengyuyan@centos7 ~]$ pkill md5sum
[1] 已终止 nice md5sum /dev/zero
[2]- 已终止 nice -n -2 md5sum /dev/zero
[3]+ 已终止 nice -n 2 md5sum /dev/zero
实时调度策略
chrt 命令
作用:用于获取和设置实时调度器进程优先级,以及更改进程调度器。
语法:
chrt [选项] [优先级] 命令 [命令参数]
chrt -p [选项] [优先级] PID
主要用法:
| 用法 | 格式 | 说明 |
|---|---|---|
| 启动新进程 | chrt [选项] 优先级 命令 | 以指定调度策略和优先级运行新命令 |
| 修改已有进程 | chrt -p [选项] 优先级 PID | 修改正在运行的进程的调度属性 |
| 查看调度属性 | chrt -p PID | 查看进程当前的调度策略和优先级 |
调度策略选项(核心)
| 选项 | 优先级范围 | 说明 |
|---|---|---|
| -o | 0 | 默认策略,所有普通进程都用这个 |
| -f | 1-99 | 实时策略:先进先出,一旦运行就持续到完 |
| -r | 1-99 | 实时策略:轮转,有时间片限制 |
| -b | 0 | 适合批处理任务,略微降低调度优先级 |
| -i | 0 | 极低优先级,只在系统空闲时运行 |
| -d | 0 | 最严格实时,指定截止时间(需额外参数) |
常用选项:
| 选项 | 全称 | 作用 |
|---|---|---|
| -p | –pid | 操作指定 PID 的进程(查看或修改) |
| -m | –max | 显示当前系统支持的优先级范围 |
| -a | –all-tasks | 修改整个进程树(所有子进程) |
| -R | –reset-on-fork | 子进程不继承实时调度策略(安全选项) |
| -v | –verbose | 显示详细信息 |
| -h | –help | 显示帮助信息 |
示例
# 查看进程优先级范围,chrt不能用于调整非实时进程nice值优先级。
[root@centos7 ~]# chrt -m
SCHED_OTHER min/max priority : 0/0
SCHED_FIFO min/max priority : 1/99
SCHED_RR min/max priority : 1/99
SCHED_BATCH min/max priority : 0/0
SCHED_IDLE min/max priority : 0/0
SCHED_DEADLINE min/max priority : 0/0
# 以SCHED_RR调度器和优先级为5运行md5sum进程
[root@centos7 ~]# chrt -r 5 md5sum /dev/zero &
[1] 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225
PID CLS RTPRIO COMMAND
56225 RR 5 md5sum /dev/zero
# 修改进程调度器和优先级
[root@centos7 ~]# chrt -f --pid 10 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225
PID CLS RTPRIO COMMAND
56225 FF 10 md5sum /dev/zero
# 修改进程调度器为非实时
[root@centos7 ~]# chrt -o --pid 0 56225
[root@centos7 ~]# ps -o pid,cls,rtprio,command 56225
PID CLS RTPRIO COMMAND
56225 TS - md5sum /dev/zero
Linux 文件系统基本管理
识别文件系统和设备
Linux 中设备
在Linux中,对存储设备的访问由特殊类型文件-块设备(block)提供。挂载块设备前,必须先使用文件系统对其进行格式化。
块设备文件与其他的设备文件一起存储在/dev目录中。设备文件是由操作系统自动创建的。
常见的不同类型接口块设备:
- 接口:SATA/SAS/USB/SCSI,名称:/dev/sda、/dev/sdb …
- 接口:virtio-blk,虚拟机磁盘,名称:/dev/vda、/dev/vdb …
- 接口:NVMe SSD,名称:/dev/nvme0n1、/dev/nvme1n1…
- 接口:SD/MMC/eMMC,名称:/dev/mmcblk0,/dev/mmcblk1 …
通常,不会将整个存储设备格式化为一个文件系统中,而是将硬盘驱动器划分为多个逻辑存储单元, 这些单元称为分区。各种分区使用不同的文件系统进行格式化或用于不同的用途。 例如,一个分区可以包含用户目录,而另一个分区可以包含系统数据和日志。 如果用户用数据填充主目录分区,则系统分区可能仍然有可用空间。
- /dev/sda第一个分区为/dev/sda1,第二个分区为/dev/sda2,以此类推。
- /dev/nvme0n1p1,/dev/nvme0n1p2
- /dev/vda1,/dev/vda2
- /dev/xvda1,/dev/xvda2
Linux 文件系统
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。
Linux服务器上的文件是按文件系统层次结构访问的。

管理文件系统需要:
- 确定存储设备的空间使用情况以及文件系统层次结构中受影响的目录。
- 存储设备发生故障,而您需要知道哪些文件系统存在风险。
要让文件系统的内容在文件系统层次结构中可用,必须将它挂载到一个空目录上,该目录被称为挂载点。
参考学习:这里
/linux 对应教室。
查看设备和文件系统
lsblk 命令
作用:查看块设备使用情况。
[root@centos7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
sr0 11:0 1 13.2G 0 rom
nvme0n1 259:0 0 200G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 199G 0 part
├─rl-root 253:0 0 70G 0 lvm /
├─rl-swap 253:1 0 3.9G 0 lvm [SWAP]
└─rl-home 253:2 0 125.1G 0 lvm /home
结果说明:
- NAME :块设备名。
- MAJ:MIN :主要(MAJ)和次要(MIN)设备号。
- RM :指明设备是否是可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
- SIZE :本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
- RO :该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
- TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
- MOUNTPOINT :本栏指出设备挂载的挂载点。
df 命令
作用:查看文件系统使用情况。
[root@centos7 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 1971384 0 1971384 0% /dev
tmpfs 1991520 0 1991520 0% /dev/shm
tmpfs 1991520 17380 1974140 1% /run
tmpfs 1991520 0 1991520 0% /sys/fs/cgroup
/dev/mapper/rl-root 73364480 6713888 66650592 10% /
/dev/sr0 13880362 13880362 0 100% /dvd
/dev/nvme0n1p1 1038336 206096 832240 20% /boot
/dev/mapper/rl-home 131081692 946976 130134716 1% /home
tmpfs 398304 0 398304 0% /run/user/0
# -h选项,友好显示单位,单位进制是1024。
# -T选项,显示文件系统类型。
[root@centos7 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 17M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 70G 6.5G 64G 10% /
/dev/sr0 iso9660 14G 14G 0 100% /dvd
/dev/nvme0n1p1 xfs 1014M 202M 813M 20% /boot
/dev/mapper/rl-home xfs 126G 925M 125G 1% /home
tmpfs tmpfs 389M 0 389M 0% /run/user/0
# -H选项,单位进制是1000。
[root@centos7 ~]# df -H
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 2.1G 0 2.1G 0% /dev
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 2.1G 18M 2.1G 1% /run
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
/dev/mapper/rl-root 76G 6.9G 69G 10% /
/dev/sr0 15G 15G 0 100% /dvd
/dev/nvme0n1p1 1.1G 212M 853M 20% /boot
/dev/mapper/rl-home 135G 970M 134G 1% /home
tmpfs 408M 0 408M 0% /run/user/0
# 查看单个文件系统
[root@centos7 ~]# df -hT /boot
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/nvme0n1p1 xfs 1014M 202M 813M 20% /boot
# 查看文件或目录存储在哪个设备
[root@centos7 ~]# df /tmp
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/rl-root 73364480 6713888 66650592 10% /
du 命令
作用:查看目录和文件占用磁盘空间大小。
语法:du [选项] [文件或目录]
如果不指定路径,默认统计当前目录
常见选项:
| 选项 | 含义 | 说明 |
|---|---|---|
| -s | 只显示总计(summary) | 不逐项列出子目录,只看总数 |
| -h | 人类可读格式 | 自动显示为 K、M、G(如 1.2G、345M) |
| -a | 显示所有文件 | 包括普通文件,不只是目录 |
| -c | 显示总合计 | 最后一行显示总大小 |
| -d N | 限制目录深度 | 只显示 N 层子目录 |
| –exclude=模式 | 排除匹配的文件或目录 | 如 --exclude=*.log |
| –time | 显示目录下文件的最新修改时间 | 用于查看目录最近何时被修改 |
| -b / -k / -m | 以字节/KB/MB 为单位显示 | 不常用,-h 更直观 |
常用命令:
| 命令 | 作用 |
|---|---|
| du -sh | 查看当前目录总大小(最常用) |
| du -sh /home/tony | 查看指定目录的总大小 |
| du -sh * | 列出当前目录下每个子目录的大小 |
| du -ah | 列出当前目录下所有文件及目录的大小 |
| du -sh --exclude=*.log | 统计时排除日志文件 |
# 查看/boot目录及其子目录占用空间
[root@centos7 ~]# du /boot
0 /boot/efi/EFI/rl/fw
6060 /boot/efi/EFI/rl
1928 /boot/efi/EFI/BOOT
7988 /boot/efi/EFI
7988 /boot/efi
2400 /boot/grub2/i386-pc
3176 /boot/grub2/locale
2504 /boot/grub2/fonts
8096 /boot/grub2
4 /boot/grub
142368 /boot
# 只查看/boot目录占用空间
[root@centos7 ~]# du -s /boot
142368 /boot
# -h 选项human方式显示size
[root@centos7 ~]# du -sh /boot
140M /boot
案例
查找根文件系统中哪个文件占用了大量空间。
# 环境准备,创建一个大小为4GB的文件:使用 0 填充该文件
[root@centos7 ~]# dd if=/dev/zero of=/usr/share/doc/dhclient-4.2.5/bigfile-4G bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 38.6659 s, 111 MB/s
# 查看过程如下:
[root@centos7 ~]# du -sk /* |sort -n
......
42988 /etc
142368 /boot
560424 /var
7917328 /usr
[root@centos7 ~]# du -sk /usr/* |sort -n
......
866408 /usr/lib
1176764 /usr/lib64
5612684 /usr/share
[root@centos7 ~]# du -sk /usr/share/* |sort -n
......
213252 /usr/share/help
442228 /usr/share/locale
4279532 /usr/share/doc
[root@centos7 ~]# du -sk /usr/share/doc/* |sort -n
......
1192 /usr/share/doc/python-kitchen-1.1.1
1216 /usr/share/doc/postfix-2.10.1
4194316 /usr/share/doc/dhclient-4.2.5
[root@centos7 ~]# du -sk /usr/share/doc/dhclient-4.2.5/* |sort -n
4 /usr/share/doc/dhclient-4.2.5/README.dhclient.d
4 /usr/share/doc/dhclient-4.2.5/dhclient.conf.example
4 /usr/share/doc/dhclient-4.2.5/dhclient6.conf.example
4194304 /usr/share/doc/dhclient-4.2.5/bigfile-4G
# 方法二:
[root@centos7 ~]# find / -size +100M 2>/dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/usr/share/doc/dhclient-4.2.5/bigfile-4G
Linux 思想:尽可能使用各种小工具完成一个复杂任务。每个小工具专注于特定的功能,KISS 原则(Keep It Simple, Stupid)。
挂载和卸载文件系统
环境准备
mkfs.xfs的作用:格式化系统
# 虚拟机添加一块硬盘/dev/sdb
[root@centos7 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
# 格式化文件系统
[root@centos7 ~]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载文件系统
当需要适用文件系统的时候,通过mount命令挂载。
mount 命令语法:
mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint
选项说明:
| 部分 | 含义 | 说明 |
|---|---|---|
| [-fnrsw] | 全局选项 | 控制挂载行为(如只读、不写 /etc/mtab) |
| [-t vfstype] | 文件系统类型 | 指定文件系统格式(如 xfs、ext4、vfat) |
| [-o options] | 挂载选项 | 具体挂载参数(如 rw、ro、noexec) |
| device | 设备名 | 要挂载的设备(如 /dev/sdb1) |
| mountpoint | 挂载点 | 挂载到的目录(如 /mnt/data) |
# 创建挂载点
[root@centos7 ~]# mkdir /data
# 显示系统中所有文件系统
[root@centos7 ~]# blkid
# 显示系统中特定文件系统
[root@centos7 ~]# blkid /dev/sdb
/dev/sdb: UUID="f20547b2-df53-46e5-b526-a8744be26231" TYPE="xfs"
# 挂载设备并验证
[root@centos7 ~]# mount /dev/sdb /data
# 或者
[root@centos7 ~]# mount UUID="f20547b2-df53-46e5-b526-a8744be26231" /data
# 验证
[root@centos7 ~]# df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sdb 20G 33M 20G 1% /data
# 创建文件测试
[root@centos7 ~]# touch /data/file-{00..09}
[root@centos7 ~]# ls /data
file-00 file-02 file-04 file-06 file-08
file-01 file-03 file-05 file-07 file-09
查看系统当前所有挂载,可以看到挂载的详细信息。
root@centos7 ~]# mount
......
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
......
# 括号中属性,是文件系统当前支持的功能。
root@centos7 ~]# mount |grep ^/dev
/dev/mapper/rl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/nvme0n1p1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/mapper/rl-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
卸载文件系统
当文件系统不使用的时候,通过 umount 命令卸载。
umount命令语法:
umount device | dir
可以通过指定设备或者挂载点,卸载文件系统。
示例:
[root@centos7 ~]# umount /dev/sdb
# 或者
[root@centos7 ~]# umount /data
[root@centos7 ~]# df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rl-root 50G 4.3G 46G 9% /
卸载失败处理
[root@centos7 ~]# mount /dev/sdb /data
[root@centos7 ~]# cd /data
[root@centos7 data]# ls
file-00 file-02 file-04 file-06 file-08
file-01 file-03 file-05 file-07 file-09
# 提示挂载点正在忙碌
[root@centos7 data]# umount /dev/sdb
umount: /data: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
lsof 命令
lsof,list open files,用于查看系统打开的文件。
lsof 命令语法:
lsof [options] [names]
names:文件或文件系统设备
常用选项:
| 选项 | 作用 |
|---|---|
| -i | 查看打开的 Internet 文件 |
| -p | 根据进程PID查找特定进程打开的文件 |
| -u | 根据用户 uid查找特定用户打开的文件 |
# 新开窗口查看哪个进程在使用挂载点
[root@centos7 ~]# lsof /data
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1508 root cwd DIR 8,17 156 64 /data
fuser 命令
作用:用于识别进程打开的文件。
语法:fuser [选项] 文件/目录/设备
常见选项:
| 选项 | 作用 |
|---|---|
| -k | 杀死这些正在访问这些文件的进程。除非使用-signal修改信号,否则将发送SIGKILL信号 |
| -signal | 指定发送的信号(signal 使用特定信号替换),缺省信号SIGKILL |
| -i | 交互模式杀死进程 |
| -l | 列出所有已知的信号名称 |
| -m | 列出文件系统被哪些程序使用 |
| -n | 空间,选择不同的名字空间,可是file,udp,tcp。默认是file,也就是文件 |
| -4 | 仅查询IPV4套接字 |
| -6 | 仅查询IPV6套接字 |
| -u | 指定用户名 |
# 新开窗口查看哪个进程在使用挂载点
[root@centos7 ~]# fuser -m /data
/data: 1508c
终止进程,再次卸载
# 返回家目录,再次卸载
[root@centos7 data]# cd
[root@centos7 ~]# umount /data
案例:Linux 挂载 NTFS 格式U盘
思路:默认情况下 Linux不识别NTFS格式文件系统,需要安装相应的模块进行识别。
- 安装 ntfs-3g (该软件包由epel仓库提供)
- 挂载
yum install -y ntfs-3g
mount.ntfs /dev/sdb1 /mnt
案例:Linux 挂载 exfat 格式U盘
思路:默认情况下 Linux 不识别 exfat 格式文件系统,需要安装相应的模块进行识别。
yum install -y gcc fuse-devel make pkg-config
wget https://github.com/relan/exfat/releases/download/v1.2.0/fuse-exfat-1.2.0.tar.gz
tar -xf fuse-exfat-1.2.0.tar.gz
cd fuse-exfat-1.2.0
./configure
make && make install
# 挂载exFAT格式的U盘(假设U盘设备为/dev/sdb1)
mount.exfat /dev/sdb1 /mnt
案例:构建基于 ISO 文件的 yum 仓库
client 想安装图形化,但仓库来源于Internet,希望使用本地仓库以提高速度。
现要求在server服务器上部署nginx服务发布dvd光盘中的仓库。
操作思路:
- server上部署并配置nginx服务
- server上挂载 ISO 文件到nginx服务网站目录
- client创建指向server上web站点仓库
- 测试
部署web服务器
curl命令
作用: 是 Linux 中一个强大的网络请求工具,常用于测试 API、下载文件、调试网络等场景
常用命令:
命令 作用 curl http://example.com 发送 GET 请求,获取网页内容 curl -I http://example.com 只查看响应头(不下载内容) curl -o file.zip http://example.com/file.zip 下载文件并保存到本地
# 安装软件
[root@server ~ 11:22:04]# yum install -y nginx
# 设置允许查看目录中清单
[root@server ~ 11:40:38]# vim /etc/nginx/nginx.conf
......
http {
# 添加以下参数
autoindex on;
......
[root@server ~ 11:42:06]# systemctl enable nginx.service --now
# 准备测试文件
[root@server ~ 11:43:26]# mv /usr/share/nginx/html/index.html{,.ori}
[root@server ~ 11:43:36]# echo welcome to Nginx website. > /usr/share/nginx/html/index.html
# 客户端测试
[root@client ~ 11:44:18]# curl http://server
welcome to Nginx website.
挂载光盘到web服务器发布目录
确保光盘关联正确的iso并连接到虚拟机
[root@server ~ 11:44:47]# mkdir /usr/share/nginx/html/dvd
[root@server ~ 11:45:49]# mount /dev/sr0 /usr/share/nginx/html/dvd
mount: /dev/sr0 is write-protected, mounting read-only
客户端测试
[root@client ~ 11:44:23]# mkdir /etc/yum.repos.d/old
[root@client ~ 11:46:19]# mv /etc/yum.repos.d/*repo /etc/yum.repos.d/old
[root@client ~ 11:46:28]# vim /etc/yum.repos.d/dvd.repo
[dvd]
name= dvd from local server
baseurl=http://10.1.8.10/dvd
gpgcheck=0
[root@client ~ 11:47:09]# yum clean all
[root@client ~ 11:47:51]# yum grouplist
Loaded plugins: fastestmirror
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
Basic Web Server
Virtualization Host
......
[root@client ~ 11:48:08]# yum groupinstall -y 'Server with GUI'
# 启动图形化
[root@client ~ 11:49:08]# init 5
# 切换到字符
[root@client ~ 11:50:08]# init 3
查找系统中文件
locate
locate 命令根据文件名及其路径,在 mlocate 数据库中查找文件,并返回结果。数据库中存放文件和文件路径信息。
常规用户查找时,返回的结果仅包含用户有读取权限的目录树中匹配项。
查找文件前,需要root用户手动执行updatedb命令更新mlocate数据库。
[root@centos7 ~]# yum install -y mlocate
[root@centos7 ~]# updatedb
locate命令语法:locate [选项] 文件名/模式
常用选项:
| 选项 | 作用 |
|---|---|
| -b | 仅匹配文件名 |
| -i | 忽略大小写 |
| -c | 只显示数量(不列出路径) |
| -r | 使用正则表达式搜索 |
示例:
[root@centos7 ~]# yum install -y httpd
# 安装后,未跟新数据库,所以检索不到
[root@centos7 ~]# locate httpd.conf
# 更新后查找
[root@centos7 ~]# updatedb
[root@centos7 ~]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf
# -b选项 查找
[root@centos7 ~]# locate -b httpd
# 扩展
[root@centos7 ~]# basename /usr/share/doc
doc
[root@centos7 ~]# dirname /usr/share/doc
/usr/share
# -i选项 忽略大小写
[root@centos7 ~]# locate PASSWD
/etc/PASSWD
[root@centos7 ~]# locate -i PASSWD
# -c选项 返回找到的数量
[root@centos7 ~]# locate -b -c PASSWD
34
# -r选项 正则表达式匹配查找
[root@centos7 ~]# locate -r 'http.*conf'
find命令
作用:在本地文件系统中执行实时查找文件。
语法:
find [path] [expression] [action]
- path,是查询路径,如果没有指定文件夹,将会查找当前目录及子目录。
- expression,是查询条件表达式。
- action,是找到文件后采取的动作。
根据文件 name 查找
[root@centos7 ~]# touch /etc/PASSWD
[root@centos7 ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd
[root@centos7 ~]# find /etc/ -name '*passwd*'
/etc/security/opasswd
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-
[root@centos7 ~]# find /etc/ -iname passwd
/etc/pam.d/passwd
/etc/passwd
/etc/PASSWD
根据文件 type 查找
-type 根据文件类型查找,支持文件类型:
- b,块设备文件
- c,字符设备文件
- d,目录
- p,命名管道文件
- f,普通文件
- l,符号链接文件
- s,套接字文件
[root@centos7 ~]# mkdir /etc/yum.repos.d/passwd
[root@centos7 ~]# find /etc/ -name 'passwd' -type d
/etc/yum.repos.d/passwd
[root@centos7 ~]# rmdir /etc/yum.repos.d/passwd
根据文件 owner 查找
-
-user、-uid,属于特定用户。
[root@centos7 ~]# id laoma uid=1000(laoma) gid=1000(laoma) groups=1000(laoma) [root@centos7 ~]# find / -user laoma [root@centos7 ~]# find / -uid 1000 -
-group、-gid,属于特定组
[root@centos7 ~]# grep wheel /etc/group wheel:x:10: [root@centos7 ~]# find / -group wheel [root@centos7 ~]# find / -gid 10 -
-nouser,不属于任何用户;-nogroup,不属于任何组
# 查找系统中不属于任何用户或者不属于任何组的文件 [root@centos7 ~]# find / -nouser -o -nogroup
根据文件 perm 查找
# 准备文件
[root@centos7 ~]# mkdir lab;cd lab
[root@centos7 lab]# touch file-{1..3}
[root@centos7 lab]# ls -l file*
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-1
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-2
-rw-r--r--. 1 root root 0 Dec 24 20:28 file-3
-
-perm mode,查找文件权限为mode的文件。
[root@centos7 lab]# chmod 764 file-1 # 查找文件权限为764的文件 [root@centos7 lab]# find -perm 764 | xargs ls -l -rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-1 -
-perm -mode,例如:mode为764,则ugo必须同时满足的最小权限:user至少为7、group至少为6、other为4。
[root@centos7 lab]# chmod 777 file-1 [root@centos7 lab]# chmod 764 file-2 [root@centos7 lab]# chmod 760 file-3 [root@centos7 lab]# find . -perm -764 | xargs ls -l -rwxrwxrwx. 1 root root 0 Dec 24 20:28 ./file-1 -rwxrw-r--. 1 root root 0 Dec 24 20:28 ./file-2 # 0作为通配符,表示不匹配对应权限位。 # 查找系统中具有suid权限的文件 [root@centos7 lab]# find / -perm -4000 # 查找系统中同时具有特殊权限的文件:suid和sgid [root@centos7 lab]# find / -perm -6000 2>/dev/null |xargs ls -l -rwsr-sr-x. 1 abrt abrt 15344 Oct 2 2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache -
-perm /mode,例如mode为764,则ugo只要有一个满足即可:user至少为7、group至少为6、other至少为4。
[root@centos7 lab]# chmod a=- file-1 [root@centos7 lab]# chmod uo=-,g=rwx file-2 [root@centos7 lab]# chmod ug=-,o=r file-3 [root@centos7 lab]# find -name 'file-*' -perm /764| xargs ls -l ----rwx---. 1 root root 0 Dec 24 20:28 ./file-2 -------r--. 1 root root 0 Dec 24 20:28 ./file-3 # 查找系统中具有特殊权限的文件:suid、sgid、sticky [root@centos7 lab]# find / -perm /7000 # 查找系统中具有特殊权限的文件:suid或者sgid [root@centos7 lab]# find / -perm /6000 -
-readable -writable -executable,文件具有可读、可写、可执行。
根据文件 size 查找
单位 c(字节)、k(KiB)、M(MiB)、G(GiB)
# 大小等于10M
[root@centos7 ~]# find -size 10M
# 大小大于10G
[root@centos7 ~]# find -size +10G
# 大小小于10k
[root@centos7 ~]# find -size -10k
# 大小等于1M
[root@centos7 ~]# find -size 1M
# 注意:size会取整为1个单位,所以find -size 1M结果包含小于1M的文件。
# 可以使用1024k取代1M
[root@centos7 ~]# find -size 1024k
根据文件 time 查找
- -amin, -cmin, -mmin 单位1分钟。
- -atime, -ctime, -mtime 单位24小时。
- -newer file,比某个文件新的文件。
-a开头的是访问时间
-c开头的是状态变更时间
-m开头的是修改时间
# 10分钟前(正好10分钟)
[root@centos7 ~]# find -amin 10
# 10分钟以前(大于10分钟)
[root@centos7 ~]# find -amin +10
# 10分钟以内(小于10分钟)
[root@centos7 ~]# find -amin -10
根据文件硬链接数和 inum 查找
# 硬链接数等于、大于、小于3的文件
[root@centos7 ~]# find -links 3
[root@centos7 ~]# find -links +3
[root@centos7 ~]# find -links -3
# inode为67160130的文件
[root@centos7 ~]# ls -i /etc/fstab
67160130 /etc/fstab
[root@centos7 ~]# find / -inum 67160130| xargs ls -i
67160130 /etc/fstab
多条件表达式
-
逻辑与:
expr1 -a expr2或者expr1 expr2[root@centos7 lab]# find . -name 'file-*' -perm /764 -
逻辑或:expr1 -o expr2
# 查找系统中不属于任何用户或者不属于任何组的文件 [root@centos7 ~]# find / -nouser -o -nogroup # 例如 [root@centos7 ~]# find / -perm /7000 # 等效与 [root@centos7 ~]# find / -perm -4000 -o -perm -2000 -o -perm -1000 -
逻辑非:! expr
[root@centos7 ~]# find / ! -size -200M 2>/dev/null /proc/kcore /proc/59432/task/59432/fd/5 /proc/59432/task/59432/fdinfo/5 /proc/59432/fd/6 /proc/59432/fdinfo/6 [root@centos7 ~]# ls -lh /proc/kcore -r--------. 1 root root 128T Dec 24 22:00 /proc/kcore
action
-
-delete,查出找到的文件。
[root@centos7 ~]# find / -name PASSWD /etc/PASSWD [root@centos7 ~]# find / -name PASSWD -delete [root@centos7 ~]# find / -name PASSWD -
-ls,相当于
ls -dils查看找到的文件。[root@centos7 ~]# find /etc/ -name passwd /etc/pam.d/passwd /etc/passwd [root@centos7 ~]# find /etc/ -name passwd -ls 67584593 4 -rw-r--r-- 1 root root 188 Apr 1 2020 /etc/pam.d/passwd 69030856 4 -rw-r--r-- 1 root root 2315 Dec 24 19:59 /etc/passwd -
-exec command ;,找到文件后,执行相应的command。
[root@centos7 ~]# find /etc/ -name passwd -exec echo haha \; haha haha -
-exec command {} ;,找到文件后,可以在命令中对文件操作。
[root@centos7 ~]# find / -inum 67160130 /etc/fstab # 将inode为67160130的所有文件复制到当前目录 [root@centos7 ~]# mkdir findfiles [root@centos7 ~]# find / -inum 67160130 -exec cp -a {} ./findfiles \; [root@centos7 ~]# ls findfiles/fstab fstab
[root@centos7 lab]# find . -name 'file-*' -perm /764
-
逻辑或:expr1 -o expr2
# 查找系统中不属于任何用户或者不属于任何组的文件 [root@centos7 ~]# find / -nouser -o -nogroup # 例如 [root@centos7 ~]# find / -perm /7000 # 等效与 [root@centos7 ~]# find / -perm -4000 -o -perm -2000 -o -perm -1000 -
逻辑非:! expr
[root@centos7 ~]# find / ! -size -200M 2>/dev/null /proc/kcore /proc/59432/task/59432/fd/5 /proc/59432/task/59432/fdinfo/5 /proc/59432/fd/6 /proc/59432/fdinfo/6 [root@centos7 ~]# ls -lh /proc/kcore -r--------. 1 root root 128T Dec 24 22:00 /proc/kcore
action
-
-delete,查出找到的文件。
[root@centos7 ~]# find / -name PASSWD /etc/PASSWD [root@centos7 ~]# find / -name PASSWD -delete [root@centos7 ~]# find / -name PASSWD -
-ls,相当于
ls -dils查看找到的文件。[root@centos7 ~]# find /etc/ -name passwd /etc/pam.d/passwd /etc/passwd [root@centos7 ~]# find /etc/ -name passwd -ls 67584593 4 -rw-r--r-- 1 root root 188 Apr 1 2020 /etc/pam.d/passwd 69030856 4 -rw-r--r-- 1 root root 2315 Dec 24 19:59 /etc/passwd -
-exec command ;,找到文件后,执行相应的command。
[root@centos7 ~]# find /etc/ -name passwd -exec echo haha \; haha haha -
-exec command {} ;,找到文件后,可以在命令中对文件操作。
[root@centos7 ~]# find / -inum 67160130 /etc/fstab # 将inode为67160130的所有文件复制到当前目录 [root@centos7 ~]# mkdir findfiles [root@centos7 ~]# find / -inum 67160130 -exec cp -a {} ./findfiles \; [root@centos7 ~]# ls findfiles/fstab fstab
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)