第一部分一次性计划任务at1.1 定义一次性计划任务在未来的某个时间点只执行一次的任务。对于 Linux 系统来说管理一次性计划任务的工具是at。真正执行任务的程序是一个叫做atd的服务。at工具只是用来查看、删除、编辑 at 任务的到了对应的时间点真正执行 at 任务的程序是atd。常用选项-l查看计划任务-d删除计划任务1.2 查看计划任务at -l或atq列出系统的所有 at 计划任务root 可以列出所有用户的普通用户只能列出自己的。[rootrhel9 ~]# at -l 1 Sun Mar 8 15:00:00 2026 a root 2 Mon Mar 9 08:00:00 2026 a root 3 Tue Mar 10 09:00:00 2026 a root 4 Sun Mar 8 16:00:00 2026 a root 5 Sun Mar 8 16:00:00 2026 a root已执行的任务不会列出atq命令的输出解释第 1 列该任务的编号第 2 列计划任务的执行时间和日期第 3 列计划任务被排入默认队列a可以用-q指定队列a-z从a到z优先级是从低到高第 4 列任务的拥有人查看计划任务的详细信息执行哪些命令at -c 任务编号[rootrhel9 ~]# at -c 61.3 定义计划任务具备 2 种定义方式交互式定义、非交互式定义。交互式定义格式at 时间时间表达方式未来具体的时间[rootrhel9 ~]# at 15:00 # 如果时间已经过去了则顺延到第二天的时间点 warning: commands will be executed using /bin/sh at touch /opt/15.file at rm -rf /tmp/* at EOT # 按 CtrlD 结束输入 job 1 at Sun Mar 8 15:00:00 2026[rootrhel9 ~]# at 09:00 2026-3-10 # 指定年月日时分 warning: commands will be executed using /bin/sh at ls /etc/passwd at EOT job 3 at Tue Mar 10 09:00:00 2026抽象的时间8:05am4pm 3 days04:00 2017-05-30teatime tomorrow更多时间的具体定义请查看文件/usr/share/doc/at/timespec。非交互式定义格式at 时间 文件示例[rootrhel9 ~]# at 16:00 at.sh warning: commands will be executed using /bin/sh job 5 at Sun Mar 8 16:00:00 20261.4 修改已经存在的 at 计划任务可以直接去编辑底层的 at 文件。每次定义了 at 任务都会在/var/spool/at/目录下生成对应的可执行文件当时间到了那一刻其实是执行了这个可执行文件。1.5 删除计划任务删除计划任务可以直接删除底层的文件也可以通过 at 工具去删除。[rootrhel9 ~]# at -d 6 [rootrhel9 ~]# atrm 51.6 at 任务执行的特殊情况重点在这种背景下你定义的 at 任务可能会失效可能执行的时间不对。定义 at 任务执行的时间是 2026 年 3 月 8 号的 10 点钟但是你的系统在 9 点 59 分的时候不小心关机了然后再次开机的时候已经到了 10 点 01 分已经超过了 at 定义的时间。那么我想问的是这个 at 任务还会执行吗得出结论即使时间过去了下一次开机的时候会立即执行 at 任务。如果此时我手动关闭 atd 服务at 任务还会执行吗 ——不会的。1.7 at 黑白名单文件作用/etc/at.deny黑名单文件处于文件中的用户无法使用 at 工具/etc/at.allow白名单文件除了文件中的用户可以使用 at 工具其他用户都不可以使用root 除外默认情况下系统只存在黑名单文件/etc/at.deny。如果同时存在黑白名单文件的话以白名单文件为主黑名单文件不再起作用。第二部分周期性计划任务crontab2.1 定义周期性计划任务在某个时间范围内重复性地去执行任务。管理工具叫crontab真正干活的是crond服务。常用选项-l查看计划任务-u管理指定账户的计划任务-e编辑当前用户计划任务-r删除计划任务2.2 定义 crontab 计划任务通过crontab工具定义计划任务格式crontab 选项[rootrhel9 ~]# crontab -e no crontab for root - using an empty one crontab: installing new crontab在编辑器中输入* * * * * /bin/echo root时间表达方式* * * * * 要执行的命令 │ │ │ │ │ │ │ │ │ └── 周 (0-7, 0和7都表示周日) │ │ │ └────── 月份 (1-12) │ │ └─────────── 日期 (1-31) │ └──────────────── 小时 (0-23) └───────────────────── 分钟 (0-59)特殊语法*/x表示每隔 x 个时间执行任务x,y表示在 x 时间和 y 时间执行任务x-y表示在 x 时间和 y 时间范围内执行应用示例0 17 * * 1-5 周一到周五每天17:00 30 8 * * 1,3,5 每周一、三、五的8点30分 0 8-18/2 * * * 08点到18点之间每隔2小时 1 10 */3 * * 每隔3天的10点1分执行其他常用选项-u 用户名以指定用户身份执行 crontab 命令工具2.3 查看计划任务[rootrhel9 ~]# crontab -l 59 23 * * * /bin/echo root查看指定用户的计划任务[rootrhel9 ~]# crontab -l -u zhangsan * * * * * echo zhangsan2.4 存储位置通过crontab -e定义的计划任务实际上是一个文件存储到/var/spool/cron/目录下文件名就是用户名。例如root 用户的 cron 任务列表文件是/var/spool/cron/root。2.5 删除计划任务[rootlocalhost cron]# crontab -r -u zhangsan [rootlocalhost cron]# crontab -l -u zhangsan no crontab for zhangsan [rootlocalhost cron]# crontab -r [rootlocalhost cron]# crontab -l no crontab for root2.6 案例备份/etc/passwd文件要求每天晚上 11 点将/etc/passwd文件备份到/opt/passwd-年月日。错误示例日志中显示错误Jun 13 14:34:01 localhost CROND[4891]: (root) CMD [(cp -a /etc/passwd /opt/passwd-$(date )] Jun 13 14:34:01 localhost CROND[4889]: (root) CMDOUT (/bin/sh: -c: line 1: unexpected EOF while looking for matching )) Jun 13 14:34:01 localhost CROND[4889]: (root) CMDOUT (/bin/sh: -c: line 2: syntax error: unexpected end of file) Jun 13 14:34:01 localhost CROND[4889]: (root) CMDEND (cp -a /etc/passwd /opt/passwd-$(date )正确写法注意%需要转义[rootlocalhost log]# crontab -e * * * * * cp -a /etc/passwd /opt/passwd-$(date \%F)2.7 日志路径/var/log/cron2.8 其他位置定义 crontab 的计划任务除了crontab -e把计划任务定义到了/var/spool/cron/目录下之外还有1./etc/crontab直接通过编辑这个文件来定义周期性计划任务。注意在这个文件中定义的周期性计划任务不能通过crontab -l来查看只能查看这个文件本身。2./etc/cron.d/目录系统自带的计划任务位置。[rootlocalhost log]# cd /etc/cron.d [rootlocalhost cron.d]# ll total 4 -rw-r--r--. 1 root root 128 Jul 11 2022 0hourly查看0hourly文件内容[rootlocalhost cron.d]# cat 0hourly # Run the hourly jobs SHELL/bin/bash PATH/sbin:/bin:/usr/sbin:/usr/bin MAILTOroot 01 * * * * root run-parts /etc/cron.hourly3. 系统自带的脚本目录/etc/cron.hourly//etc/cron.daily//etc/cron.weekly//etc/cron.monthly/这些目录中包含的是可执行的 shell 脚本而不是 crontab 文件。示例[rootlocalhost bin]# cd /etc/cron.hourly/ [rootlocalhost cron.hourly]# ls 0anacron4. anacron 相关/var/spool/anacron/中的文件用于检查每天、每周和每月的任务是否运行。配置文件/etc/anacrontab第1列时间间隔第2列延迟时间分钟第3列作业的名称第4列要执行的命令2.9 crontab 黑白名单文件作用/etc/cron.deny黑名单文件处于黑名单文件的用户无法使用 crontab 工具/etc/cron.allow白名单文件只有处于白名单文件的用户才可以使用 crontab 工具除此之外其他用户都无法使用root 除外黑白名单如果用户冲突则白名单优先级更高如果同时存在黑白名单则黑名单文件无效。第三部分文件查找工具3.1 locate —— 基于索引的模糊查找特点模糊查找基于数据库索引文件来找的只要包含文件的关键字就可以搜索到。如果数据库的索引文件被删除了则无法使用需要执行updatedb来更新数据库的索引文件。Locate 不是实时查询的可能有些文件明明存在但是搜索不到需要手动更新数据库索引文件。所有的查找工具有一个共同点查找文件所在的目录必须要有 r 和 x 的权限。优点速度快根据索引查询。缺点无法实时搜索文件只能根据索引去搜索文件。数据库文件路径/var/lib/mlocate/mlocate.db常用选项-i忽略大小写来查找文件-n x可列出指定的 x 行适用场景系统中文件非常多你只记得文件名中包含的关键字建议使用locate去查询因为它的查询速度非常快。3.2 find —— 实时查找功能强大特点实时查询文件精确查询也可以模糊查询支持各种通配符的使用。Find 工具可以让你在查找到文件后再次执行二次命令比如说在系统当中搜索所有以.swp结尾的文件然后去删除掉。支持各种条件查询文件名、inode 编号、权限、拥有人、拥有组、时间戳、目录层级。所有的查找工具有一个共同点查找文件所在的目录必须要有 r 和 x 权限。Find 查询的时候是遍历查询效率比locate低。基本语法find 查询目录 查询条件 命令操作示例find /home -name zhangsan -print默认情况下-print就是默认的操作表示打印输出可以省略。find /home -name zhangsan如果查询目录不写就表示在当前目录下查找find -name zhangsan3.3 查询条件详解3.3.1 根据文件名和 inode 编号查询-name根据文件名查询[rootlocalhost ~]# find /root/ -name anaconda-ks.cfg /root/anaconda-ks.cfg-iname不区分大小写find /etc -iname passwd-inum根据 inode 编号搜索示例查找硬链接文件[rootlocalhost ~]# ll -i zhaomi 18195894 -rw-r--r--. 2 root root 0 Jun 13 16:48 zhaomi [rootlocalhost ~]# ll -i /opt/zhaomi-link 18195894 -rw-r--r--. 2 root root 0 Jun 13 16:48 /opt/zhaomi-link [rootlocalhost ~]# find / -inum 18195894 /root/zhaomi /opt/zhaomi-link-links查找链接数为 number 的文件3.3.2 根据文件拥有人/拥有组的身份查询选项说明-uid UID按照用户 ID 查找所有者是指定 ID 的文件-gid GID按照组 ID 查找所有者是指定 ID 的文件-user 用户名按照用户名查找所有者是指定用户的文件-group 组名按照组名查找所有者是指定用户组的文件-nouser查找没有所有者的文件-nogroup查找没有拥有组的文件示例find / -user root # 查找所属人是 root 的文件 find / -uid 0 # 查找 uid 是 0 的文件 find / -gid 0 # 查找 gid 是 0 的文件3.3.3 根据文件大小查找选项-size [/-]文件大小常用单位k, M, G# 查找文件大小 5M find /etc -size 5M # 查找文件大小 5M find /etc -size 5M # 查找文件大小 5M find /etc -size -5M3.3.4 根据文件类型查找选项-type [f/b/c/d/l/p/s]类型说明f普通文件b块设备c字符文件d目录l链接文件p管道文件s套接字文件示例find /etc -type d # 查看 etc 目录下的子目录 find /etc -type f # 查看 etc 目录下的文件3.3.5 根据权限查找选项-perm [/|-]MODE模式说明MODE精确匹配权限/MODE任何一类u,g,o对象的权限中只要能一位匹配即可属于或关系。以前用RHEL 7 以后用/替代-MODE每一类对象都必须同时拥有指定权限属于与关系0表示不关注示例find -perm 644 # 严格匹配 644 的文件 find -perm /222 # u,g,o 任何一类用户有写权限即匹配 find -perm -222 # 严格匹配写权限即每个用户必须要有写权限 find -perm -002 # 严格匹配 other 用户的写权限3.3.6 根据时间戳查找选项含义-atime [-]时间根据文件访问时间搜索天数-mtime [-]时间根据文件修改时间搜索天数-ctime [-]时间根据文件改动时间搜索属性天数-amin/-mmin/-cmin分钟级时间参数说明7表示 7 天以及 7 天之前的时间-7表示 7 天之内的时间7表示 7-8 天的时间包含第 7 天示例find /etc -mtime -5 # 查找 etc 目录下 5 天之内被修改的文件3.3.7 根据层级目录查找-maxdepth N 最大搜索N个层级 [rootlocalhost etc]# find /etc/ -maxdepth 2 -name *.conf [rootlocalhost etc]# find /etc/ -maxdepth 1 -name *.conf -mindepth N 最小搜索从第N个层级开始 [rootlocalhost etc]# find /etc/ -mindepth 2 -name *.conf3.3.8 逻辑组合查找选项说明-a与默认-o或-not或!非示例find /home -type f -user admin find /home -user user1 -not -group user23.4 在查找到的文件上继续操作动作常用动作动作说明-print默认动作显示至屏幕-ls类似于对查找到的文件执行ls -l命令-delete删除查找到的文件-fls 文件查找到的所有长格式的信息保存至指定文件中-ok COMMAND {} \;对查找到的每个文件执行由 COMMAND 指定的命令且都会交互式要求用户确认-exec COMMAND {} \;对查找到的每个文件执行由 COMMAND 指定的命令注意{}用于引用查找到的文件名称自身。由于很多命令不支持管道|来传递参数而日常工作中有这个必要所以就有了xargs命令find | xargs COMMAND find -name *.sh | xargs chmod 7553.5 find 查找示例汇总示例1将配置文件备份到指定目录下并添加扩展名.orgfind . -name *.conf -exec cp -r {} /testdir/{}.org \;示例2删除存在时间超过 3 天以上的属主为 young 的临时文件find /tmp -ctime 3 -user young -exec rm -fr {} \;示例3在主目录中查找可被其它用户写入的文件将其 w 权限去掉find ~ -perm -002 find ~ -perm -002 -exec chmod o-w {} \;示例4查找/var目录下属主为 root且属组为 mail 的所有文件find /var -user root -group mail -ls # 默认关系就是与示例5查找/var目录下不属于 root、lp、gdm 的所有文件find /var ! -user root ! -user lp ! -user gdm示例6查找/var目录下最近一周内其内容修改过同时属主不为 rootfind /var/ -mtime -7 ! -user root -ls示例7查找当前系统上没有属主或属组且最近一个周内曾被访问过的文件find / -nouser -o -nogroup -a -atime -7示例8查找/etc目录下大于 1M 且类型为普通文件的所有文件find /etc/ -size 1M -type f示例9查找/etc目录下所有用户都没有写权限的文件find /etc/ ! -perm /222示例10查找/etc目录下至少有一类用户没有执行权限的文件find /etc/ ! -perm -111 # 至少有一类用户没有反过来就是所有用户都有示例11找出/tmp目录下属主不是 root且文件名不以 f 开头的文件find /tmp \( -not -user root -a -not -name f* \) -ls # 或 find /tmp -not \( -user root -o -name f* \) -ls3.6 补充Word 文档中的完整示例[rootlocalhost ~]# touch zhaomi [rootlocalhost ~]# ln zhaomi /opt/zhaomi-link [rootlocalhost ~]# ll -i zhaomi 18195894 -rw-r--r--. 2 root root 0 Jun 13 16:48 zhaomi [rootlocalhost ~]# ll -i /opt/zhaomi-link 18195894 -rw-r--r--. 2 root root 0 Jun 13 16:48 /opt/zhaomi-link [rootlocalhost ~]# find / -inum 18195894 /root/zhaomi /opt/zhaomi-link第四部分总结对比工具任务类型执行服务配置文件/目录查找方式速度是否实时at一次性atd/var/spool/at/---crontab周期性crond/var/spool/cron/、/etc/crontab、/etc/cron.d/---locate文件名查找-/var/lib/mlocate/mlocate.db索引快否find多条件查找--遍历慢是