Linux的定时任务crontab
- 打开终端并以超级用户(root)身份登录。
-
输入以下命令以编辑 crontab 文件:
sudo crontab -e
sudo crontab -e
在大多数 Linux 发行版中,只有 root 用户或具有 sudo 权限的用户才能编辑系统范围的 crontab 文件。这是因为 crontab 文件通常位于系统目录中,并且对其进行编辑可能会影响系统的运行和安全。
如果你希望编辑系统范围的 crontab 文件(即对所有用户有效),需要使用 root 用户或具有 sudo 权限的用户来执行
crontab -e
。但是,对于普通用户来说,通常也有一个用户级别的 crontab 文件,只对该用户有效。普通用户可以使用
crontab -e
命令来编辑自己的 crontab 文件,而不需要 root 权限。总结来说,如果你要编辑系统范围的 crontab 文件,需要使用 root 或具有 sudo 权限的用户执行
crontab -e
。如果你要编辑用户级别的 crontab 文件,可以作为普通用户执行crontab -e
。 -
如果是第一次编辑 crontab 文件,系统会要求选择默认的编辑器。选择你熟悉的编辑器,比如 vim 或 nano,并按照提示进行选择。
-
在编辑器中,每一行代表一个定时任务。每行的格式如下:
# 每小时的0分、15分、30分、45分执行一次 0,15,30,45 * * * * /opt/dns_health_check.sh >> /opt/dns_health_check.log 2>&1 # 也可以等效表示为如下 */15 * * * * /opt/dns_health_check.sh >> /opt/dns_health_check.log 2>&1 ~ ~ ~ "/tmp/crontab.iHFLL5" 3L, 103C
在 crontab 中,用于指定定时任务执行时间的字段是由五个星号组成的,格式为
* * * * *
。每个星号代表一个时间单位,依次表示分钟、小时、日期、月份和星期几。这里是一些常见的表述方式:
-
指定具体的数值:
*
:匹配任意值。例如,* * * * *
匹配每分钟执行一次。5
:匹配指定的数值。例如,5 * * * *
匹配每小时的第5分钟执行一次。
-
指定多个数值:
1,3,5
:匹配指定的多个数值。例如,1,3,5 * * * *
匹配每小时的第1、第3和第5分钟执行一次。1-5
:匹配一个范围内的数值。例如,1-5 * * * *
匹配每小时的第1至第5分钟执行一次。
-
指定时间间隔:
*/5
:匹配每个指定间隔的数值。例如,*/5 * * * *
匹配每隔5分钟执行一次。0-59/5
:匹配在指定范围内的每个指定间隔的数值。例如,0-59/5 * * * *
匹配每隔5分钟执行一次。
-
指定列表和通配符的组合:
1,3,*/10
:匹配指定的数值和每个指定间隔的数值。例如,1,3,*/10 * * * *
匹配第1、第3分钟,以及每隔10分钟执行一次。
需要注意的是,不同的时间单位具有不同的取值范围,如分钟范围为 0-59,小时范围为 0-23,日期范围为 1-31,月份范围为 1-12,星期范围为 0-7(其中0和7都代表星期日)。具体的使用方式可以根据实际需求进行组合和调整。
这些表述方式可以灵活地用于定制定时任务的执行时间。根据具体的需求,结合适当的表述方式来设置合适的时间规则。
-
最后:
-
编辑现有的定时任务: 修改或者删除已存在的定时任务。在编辑界面中,找到您想要修改的定时任务,然后进行相应的更改。
-
保存更改并退出编辑界面: 在编辑界面中,使用适当的快捷键保存更改并退出。
-
检查定时任务是否生效: 编辑完成后,系统会自动重新加载 crontab,您可以使用
crontab -l
命令检查当前的定时任务列表,确认您的更改已生效。 -
要删除当前用户的定时任务列表:可以使用命令:
crontab -r
或者crontab -e
重新编辑
附:DNS自动检测脚本
#!/bin/bash
# 获取当前时间
Mark=$(date +"%Y-%m-%d %H:%M:%S")
# 检查 BIND 服务状态是否为active,若不是则重启
if ! systemctl is-active --quiet named.service; then
echo -e "\033[1;33m$Mark BIND 服务未运行或出现错误,正在尝试重启。\033[0m"
sudo systemctl restart named
echo "www.sina.com的解析为:$(dig www.sina.com +short)"
exit 1
fi
# 检查 DNS 解析
domains=("www.baidu.com" "www.qq.com" "www.sina.com")
for domain in "${domains[@]}"; do
dns_query=$(dig "$domain" +short)
if [ -z "$dns_query" ]; then
echo -e "\033[1;33m$Mark DNS解析域名${domain}异常!\033[0m"
echo "执行 DNS 重启操作..."
sudo rndc reload
echo "执行 DNS 缓存清理操作..."
sudo rndc flush
echo "DNS 服务已重启。"
exit 1
else
echo "$Mark DNS 解析正常。"
echo "${domain}的域名解析为:$(dig ${domain} +short)"
fi
done