一次性任务
功能介绍:
如果我们希望在将来的某个时间点去执行某件事件,这个事件执行完后任务就结束,那么我们
就可以使用一性计划任务。而要实现这种功能,我们需要任务 atd 服务。我们先查询一下系
统是否存在这个服务。
查看是否存在这个服务
[root@free ~]# ps -ef | grep atp
root 2466 2371 0 20:22 pts/0 00:00:00 grep --color=auto atp命令解释
ps -ef:这是一个用于查看系统中所有进程详细信息的命令。其中,ps 是用于报告当前进程状态的工具,-e 表示显示所有进程,-f 表示显示完整格式的输出,包含进程的所有者、进程 ID、父进程 ID、CPU 使用时间、启动时间、终端等信息。|:这是管道符号,它的作用是将前一个命令(ps -ef)的输出作为后一个命令(grep atp)的输入。
grep atp:grep 是一个强大的文本搜索工具,它会在输入的文本中查找包含指定模式(这里是 atp)的行。所以,grep atp 会从 ps -ef 的输出里找出包含 atp 的行。输出解释
root 2466 2371 0 20:22 pts/0 00:00:00 grep --color=auto atp
这一行输出由多个字段构成,各字段的含义如下:
root:这是进程的所有者,意味着该进程是由 root 用户启动的。
2466:这是进程的 ID(PID),每个正在运行的进程都有一个唯一的 PID,可用于对进程进行管理,比如终止进程等操作。
2371:这是父进程的 ID(PPID),表示该进程是由 PID 为 2371 的进程创建的。
0:这个字段代表 CPU 的使用率,这里是 0,表示该进程当前几乎没有占用 CPU 资源。
20:22:这是进程的启动时间,表明该进程在 20:22 这个时刻开始运行。
pts/0:这代表进程所关联的终端。pts 是伪终端的意思,pts/0 就是一个伪终端设备。
00:00:00:这个字段表示进程所使用的 CPU 时间,这里是 0,说明该进程到目前为止几乎没有使用 CPU 时间。
grep --color=auto atp:这是进程的命令行,也就是启动该进程所执行的命令。--color=auto 这个参数让 grep 在输出结果时,将匹配到的内容用颜色进行标记,方便查看。
[root@localhost ~]# find / -name atd*
[root@free ~]# find / -name atd*
/run/atd.pid
/sys/fs/cgroup/system.slice/atd.service
/etc/pam.d/atd
/etc/systemd/system/multi-user.target.wants/atd.service
/etc/sysconfig/atd
/usr/sbin/atd
/usr/lib/systemd/system/atd.service
/usr/share/man/man8/atd.8.gzfind:这是一个在文件系统中查找文件和目录的强大命令。它能够依据多种条件来搜索文件,像文件名、文件类型、文件大小、修改时间等。
/:这是 find 命令的搜索起始路径。/ 代表根目录,意味着搜索会从整个文件系统的最顶层开始,也就是会遍历所有的文件和目录。
-name:这是 find 命令的一个选项,其作用是按照文件名进行搜索。
atd*:这是要搜索的文件名模式。* 是通配符,它可以匹配任意数量(包括零个)的任意字符。所以,atd* 能够匹配所有以 atd 开头的文件名。
没有则下载
[root@localhost ~]# dnf install at -y
再去差找进程,文件
# 查询与atd相关的文件
[root@localhost ~]# find / -name atd*
/etc/pam.d/atd
/etc/sysconfig/atd
/etc/systemd/system/multi-user.target.wants/atd.service
/usr/sbin/atd
/usr/lib/systemd/system/atd.service
/usr/share/man/man8/atd.8.gz
# 启动atd服务
[root@localhost ~]# systemctl start atd
# 查看atd进程信息
[root@localhost ~]# ps -ef | grep atd
root 12414 1 0 09:51 ? 00:00:00 /usr/sbin/atd -f
root 12416 1109 0 09:51 pts/0 00:00:00 grep --color=auto
atdroot 12414 1 0 09:51 ? 00:00:00 /usr/sbin/atd -froot:表示该进程的所有者是 root 用户。
1461:进程 ID(PID),是系统为该进程分配的唯一标识。
1:父进程 ID(PPID),说明该进程的父进程是系统初始化进程(PID 为 1,通常是 systemd 或 init)。
0:CPU 使用率,表示该进程到目前为止占用的 CPU 时间百分比相对较低。
20:16:进程的启动时间,即该进程在 20:16 开始运行。
?:表示该进程没有控制终端(no controlling terminal)。
00:00:00:累计的 CPU 时间,即该进程自启动以来总共使用的 CPU 时间。
/usr/sbin/atd -f:atd 是一个守护进程,负责运行使用 at 命令安排的在指定时间执行的任务。-f 是 atd 命令的一个选项,可能表示以某种特定的前台模式运行(具体取决于 atd 的实现,通常用于调试等目的)。
使用示例
[root@free ~]# at now +2min
warning: commands will be executed using /bin/sh
at> echo hellow world<EOT>
job 4 at Mon Apr 28 20:45:00 2025at now + 2min 是 at 命令的一种使用方式。at 是一个用于在指定时间执行任务的工具,它允许你将一个或多个命令安排在未来的某个时间点运行。具体参数含义如下:
now:表示当前时间。
+ 2min:表示在当前时间的基础上往后推迟 2 分钟。所以 at now + 2min 整体意思是在当前时间往后推 2 分钟的时候执行后续你输入的命令。注意:
然后按下 Ctrl + D,系统就会在当前时间往后推 2 分钟时执行这条命令小时(hour 或 h):例如 at now + 1h 表示在当前时间的 1 小时后执行任务。
天(day 或 d):如 at now + 2d 代表在当前时间的 2 天后执行任务。
周(week 或 w):at now + 1w 意味着在当前时间的 1 周后执行任务。
at命令没有秒哈
计划所在的目录
# 3. 计划任务所在的目录
[root@localhost ~]# ll /var/spool/at
total 4
-rwx------. 1 root root 3163 Apr 20 10:01 a0000101bbce3a
drwx------. 2 root root 6 Apr 4 2022 spool
计划任务权限管理
对于 atd 这个服务来说,我们可以 /etc/at.deny 文件定义哪些用户不允许使用这个任务。也
可以在 /etc/at.allow 文件定义哪些用户是允许使用计划任务的。如果两个文件中都同时存在
相同的用户,那么这些相同用户是可以被允许执行的。如果两个文件中都不存在 ,则只有
root 用户可以执行。
# 1. 为root用户指定了一个计划任务,使用 ctrl+d 结束输入[root@free ~]# at now+2min
warning: commands will be executed using /bin/sh
at> wall hellow
at> <EOT>wall 是 Linux 系统中的一个命令,其英文全称是 “write all”,功能是向系统中所有已登录的用户发送广播消息。
# 2. 查询当前未被执行的任务列表
[root@localhost ~]# atq
2 Sun Apr 20 10:13:00 2025 a root
[root@localhost ~]# at -l
2 Sun Apr 20 10:13:00 2025 a root
[root@localhost ~]# ll /var/spool/at
total 4
-rwx------. 1 root root 3164 Apr 20 10:10 a0000201bbce45
drwx------. 2 root root 6 Apr 20 10:02 spool
# 下面是自动执行的结果
Broadcast message from root@localhost.localdomain (somewhere) (Sun Apr
20 10:13
hello
^C1. atq 命令及输出
atq 是 at 命令的一个子命令,英文全称为 “at queue”,它的作用是列出当前用户(或者在以 root 用户执行时列出所有用户)在 at 队列中等待执行的任务。
输出:
2 Sun Apr 20 10:13:00 2025 a root2:这是任务的编号,用于唯一标识队列中的任务。在对任务进行操作(如删除任务)时,需要用到这个编号。
Sun Apr 20 10:13:00 2025:表示该任务计划执行的时间,即 2025 年 4 月 20 日星期日的 10:13:00。
a:这个字符代表任务的优先级,a 通常是默认的优先级。
root:表明该任务是由 root 用户提交的。2. at -l 命令及输出
at -l 与 atq 功能相同,都是用于列出 at 队列中的任务。所以其输出和 atq 是一样的:
2 Sun Apr 20 10:13:00 2025 a root
切换到redhat用户尝试(也就是其他用户)
[redhat@free ~]$ at now +2min
warning: commands will be executed using /bin/sh
at> wall hellow world
at> <EOT>
job 6 at Mon Apr 28 21:10:00 2025
[redhat@free ~]$ atq
6 Mon Apr 28 21:10:00 2025 a redhat# 自动执行的结果
Broadcast message from root@localhost.localdomain (somewhere) (Sun Apr
20 10:13
hello
^C
将该用户写入拒绝执行任务的文件中(退回root用户写,普通用户没有权限)
# 5. 将redhat用户写入到不被允许使用任务文件中
[root@localhost ~]# vim /etc/at.deny
[root@localhost ~]# cat /etc/at.deny
redhat
再切换到redhat用户中尝试用at写任务
[redhat@free ~]$ at now +2min
You do not have permission to use at.权限被拒绝
删除待执行目录
atrm 是 Linux 系统中用于删除使用 at 命令提交的待执行任务的命令,其英文全称是 “at remove”。
以下是 atrm 命令的常见用法和示例:
语法格式:
atrm [-V] job_number [job_number ...]其中,-V 选项是可选的,用于显示命令的版本信息;job_number 是要删除的 at 任务的编号,可以同时指定多个任务编号,用空格分隔。
示例:
首先,使用 atq 或 at -l 命令查看当前系统中待执行的 at 任务及其编号。
atq假设输出如下:
1 Sun Apr 21 14:30:00 2025 a root
2 Sun Apr 21 15:00:00 2025 a root这里显示了两个待执行的 at 任务,编号分别为 1 和 2。
然后,要删除编号为 1 的任务,可以执行以下命令:
atrm 1
执行该命令后,编号为 1 的 at 任务就会从待执行队列中被移除,不会再按计划执行。
如果要同时删除多个任务,比如删除编号为 1 和 2 的任务,可以这样输入:
atrm 1 2
注意,只有任务的所有者或具有足够权限(如 root 用户)的用户才能删除 at 任务。
周期性任务
功能介绍:
如果我们希望在每天、每周、每月的某个时间去重复执行某些任务,那么我们就需要使用周期
性的计划任务。
比如,公司一般会在每天晚上2点之后去获取我们的当前操作的日志数据,然后对些数据进行
清洗操作。这类的任务就可以放到周期性的计划任务中。
要想实现这样的功能,我们需要通过 crond 这个守护进程来实现。
# 1. 查看crond守护进程是否存在
[root@localhost ~]# ps -ef | grep crond
root 979 1 0 09:09 ? 00:00:00 /usr/sbin/crond -n
root 12583 1109 0 10:24 pts/0 00:00:00 grep --color=auto
crond
# 2. 查看crond进程是否已经启用
[root@localhost ~]# systemctl is-active crond
active
文件介绍
[root@localhost ~]# rpm -ql cronie
/etc/cron.d # 配置文件目录
/etc/cron.d/0hourly
/etc/cron.deny # 不允许执行的用户
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/cronnext
/usr/bin/crontab # 添加任务的文件
/usr/lib/systemd/system/crond.service # 启动cron的服务文件
/usr/sbin/crond # 执行任务的命令
/var/spool/cron # 计划任务日志目录
计划任务作业
对于普通用户我们可以使用 crontab 命令来管理作业,而对于 root 用户,我们可以使用
crontab -u 来管理任务
任务格式
对于cron 来实现周期性计划任务来言,它是有一定的格式的,包括以下几个且顺序如下:
1. 分钟
2. 小时
3. 日
4. 月
5. 周
这些都可以使用 * 来表示。还可以使用 x-y 表示从 x 到 y 这个范围。以及 x,y 表示列表。还
有 */x 表示每隔x的时间就做什么事。
vim /etc/crontabSHELL=/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
周期任务示例
1、以下作业将在每年 2 月 2 日上午 9 点准点执行命令 /usr/local/bin/yearly_backup
# 1. 创建一个任务
[root@localhost ~]# crontab -e
0 9 2 2 * /usr/local/bin/yearly_backup
# 2. 查看当前作用的作业
[root@localhost ~]# crontab -l
0 9 2 2 * /usr/local/bin/yearly_backup
# 3. 删除当前用户的作业
[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l
no crontab for root
2、以下作业将在七月每周五的上午 9 点和下午 5 点之间,每 5 分钟向该作业的所有者发送
包含单词 Chime 的电子邮件。
[root@localhost ~]# crontab -e
*/5 9-17 * 7 5 echo Chime
[root@localhost ~]# crontab -l
*/5 9-17 * 7 5 echo Chime
注意:每五天可以像下面的格式书写
从指定日期开始,每五天执行一次
若要从指定日期(例如 5 号)开始,之后每五天执行一次,可使用以下 cron 表达式0 0 5-31/5 * * command
该表达式与上面的类似,只是日期范围从 5 号开始,即每月的 5 号、10 号、15 号、20 号、25 号、30 号会执行任务。
3、以下作业将在每个工作午夜前的两分钟运行命令 /usr/local/bin/daily_report
[root@localhost ~]# crontab -e
58 23 * * 1-5 /usr/local/bin/daily_report
4、以下作业将在每个工作日上午 9 点执行 mutt 命令,从而将邮件消息 Checking in 发送给
收件人 boss@example.com。
1.先确认是否安装mutt
2.书写脚本
#!/bin/bash
echo "Checking in" | mutt -s "Checking in" boss@example.com上述脚本的作用是使用 echo 输出 “Checking in” 作为邮件内容,然后通过管道将其传递给 mutt 命令,同时设置邮件主题为 “Checking in”,并将邮件发送给 boss@example.comchmod +x send_email.sh
3.最后书写周期任务
0 9 * * 1-5 /path/to/send_email.sh
5、以 redhat 身份计划周期性作业,在上午 8 点到晚上 9 点之间每两分钟一次将当前日期和
时间附加到 /home/redhat/my_first_cron_job.txt。该作业只能在周一到周五运行,周六和
周日不能运行。
[redhat@localhost ~]$ crontab -e
*/2 8-21 * * 1-5 echo date >> /home/redhat/my_first_cron_job.txt