Skip to content

corn

目录

Cron 作业

Cron 是 Unix 和类 Unix 系统中的一个定时任务调度程序。它可以在指定的时间自动运行指定的命令或脚本。Cron 作业通常用于执行定期备份、系统维护任务、发送提醒等。以下是关于 cron 作业的一些详细介绍: 基本概念

  • Cron 表(Crontab): Cron 表是一个包含计划任务列表的文件。每个用户,包括系统用户,都可以有自己的 crontab 文件。
  • Cron 守护进程(cron daemon): Cron 守护进程(crond)是后台进程,它根据 crontab 文件中的指令定期运行任务。

Cron 表的格式

每个 crontab 文件包含若干行,每行代表一个计划任务。每行的格式如下:

plaintext
* * * * * 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 文件:

bash
crontab -e

这将打开默认的文本编辑器,你可以在其中添加、编辑和删除 cron 作业。 查看 Crontab

你可以使用以下命令查看当前用户的 crontab 文件:

bash
crontab -l

删除 Crontab

你可以使用以下命令删除当前用户的 crontab 文件:

bash
crontab -r

示例

以下是一些 crontab 条目的示例:

shell
# 每天凌晨 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
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 文件:

bash
sudo nano /etc/crontab

系统级的 crontab 文件和用户级的不同,系统级的文件包含一个额外的字段用于指定运行任务的用户:

plaintext
* * * * * user command

通过理解和使用 cron,你可以实现许多自动化任务,提高工作效率。

其他问题

vscode 无法保存 corn 文件

vscode 无法保存 corn 文件,Ctrl + S 保存之后就没有然后了,只能选择 Vim 或者 nano 编辑器。

解决方法:

bash
# 重新选择编辑器
select-editor

参考资料:

cron + notify-send

如果你想在 cron 作业中使用 notify-send 发送桌面通知,需要设置额外的东西

XDG_RUNTIME_DIR=/run/user/$(id -u)

bash
# 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

bash
sudo apt-get install msmtp
~/.msmtprc

写入

plaintext
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

然后测试

bash
chmod 600 ~/.msmtprc
echo -e "Subject: Test Mail\n\nThis is a test mail." | msmtp -a default recipient@example.com

使用 msmtp 作为 MTA

bash
sudo vim /usr/sbin/sendmail-msmtp

写入

bash
#!/bin/sh
msmtp -t "$@"
bash
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

bash
* * * * * echo "Cron job output" | /usr/sbin/sendmail your-email@example.com

环境变量

在 cron 任务中,环境变量是有限的,所以需要设置环境变量

可以在 crontab 文件或者脚本中设置环境变量

bash
# 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

参考资料:

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1