corn
目录
Cron 作业
Cron 是 Unix 和类 Unix 系统中的一个定时任务调度程序。它可以在指定的时间自动运行指定的命令或脚本。Cron 作业通常用于执行定期备份、系统维护任务、发送提醒等。以下是关于 cron 作业的一些详细介绍: 基本概念
- Cron 表(Crontab): Cron 表是一个包含计划任务列表的文件。每个用户,包括系统用户,都可以有自己的 crontab 文件。
- Cron 守护进程(cron daemon): Cron 守护进程(crond)是后台进程,它根据 crontab 文件中的指令定期运行任务。
Cron 表的格式
每个 crontab 文件包含若干行,每行代表一个计划任务。每行的格式如下:
* * * * * command
- - - - -
| | | | |
| | | | +----- 一周中的星期几 (0 - 7) (周日为 0 或 7)
| | | +------- 月份 (1 - 12)
| | +--------- 一个月中的某天 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)
常见的时间字段表示法
*
:表示任何值。例如,* 在分钟字段中表示“每分钟”。,
:用于分隔列表中的多个值。例如,1,2,3 在分钟字段中表示“第 1、2 和 3 分钟”。-
:用于表示范围。例如,1-5 在小时字段中表示“从第 1 小时到第 5 小时”。/
:用于表示步长。例如,*/2 在分钟字段中表示“每隔 2 分钟”。
编辑 Crontab
你可以通过以下命令编辑当前用户的 crontab 文件:
crontab -e
这将打开默认的文本编辑器,你可以在其中添加、编辑和删除 cron 作业。 查看 Crontab
你可以使用以下命令查看当前用户的 crontab 文件:
crontab -l
删除 Crontab
你可以使用以下命令删除当前用户的 crontab 文件:
crontab -r
示例
以下是一些 crontab 条目的示例:
# 每天凌晨 2 点执行备份脚本:
0 2 * * * /path/to/backup.sh
# 每隔 5 分钟检查一次磁盘使用情况:
*/5 * * * * /path/to/check_disk_usage.sh
# 每周一到周五的上午 9 点发送提醒:
0 9 * * 1-5 /usr/bin/notify-send "提醒" "开始工作!"
# 每个月的第一天凌晨 3 点清理日志文件:
0 3 1 * * /path/to/cleanup_logs.sh
# 每小时执行一次特定命令:
0 * * * * /usr/bin/some_command
环境变量
在 crontab 文件中,你可以设置环境变量。例如:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=your-email@example.com
- SHELL:指定用于运行命令的 shell。
- PATH:指定执行命令时的搜索路径。
- MAILTO:指定命令输出发送到的邮箱地址。如果为空,不发送邮件。
管理系统级 Cron 作业
系统级的 cron 作业通常放在 /etc/crontab 文件中,或者放在 /etc/cron.d/ 目录下的独立文件中。
例如,编辑系统 crontab 文件:
sudo nano /etc/crontab
系统级的 crontab 文件和用户级的不同,系统级的文件包含一个额外的字段用于指定运行任务的用户:
* * * * * user command
通过理解和使用 cron,你可以实现许多自动化任务,提高工作效率。
其他问题
vscode 无法保存 corn 文件
vscode 无法保存 corn 文件,Ctrl + S
保存之后就没有然后了,只能选择 Vim 或者 nano 编辑器。
解决方法:
# 重新选择编辑器
select-editor
参考资料:
cron + notify-send
如果你想在 cron 作业中使用 notify-send
发送桌面通知,需要设置额外的东西
XDG_RUNTIME_DIR=/run/user/$(id -u)
# crontab -e
0 0 * * * XDG_RUNTIME_DIR=/run/user/$(id -u) /usr/bin/notify-send "12点了" ""
参考资料:
无法运行报错 CRON[51648]: (CRON) info (No MTA installed, discarding output)
需要配置发送邮件的 MTA(Mail Transfer Agent)。
我这边用 ssmtp 的时候无法用 QQ 邮箱发送邮件,所以改用了msmtp
sudo apt-get install msmtp
~/.msmtprc
写入
defaults
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
account default
host smtp.qq.com
port 587
auth on
user example@qq.com
password 1234356
from example@qq.com
然后测试
chmod 600 ~/.msmtprc
echo -e "Subject: Test Mail\n\nThis is a test mail." | msmtp -a default recipient@example.com
使用 msmtp 作为 MTA
sudo vim /usr/sbin/sendmail-msmtp
写入
#!/bin/sh
msmtp -t "$@"
sudo chmod +x /usr/sbin/sendmail-msmtp
sudo ln -s /usr/sbin/sendmail-msmtp /usr/sbin/sendmail
# 测试
echo -e "Subject: Test Mail\n\nThis is a test mail sent via msmtp." | /usr/sbin/sendmail recipient@example.com
配置 cron job
* * * * * echo "Cron job output" | /usr/sbin/sendmail your-email@example.com
环境变量
在 cron 任务中,环境变量是有限的,所以需要设置环境变量
可以在 crontab 文件或者脚本中设置环境变量
# crontab -e
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 脚本
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
参考资料: