定时任务

💡 原文中文,约6100字,阅读约需15分钟。
📝

内容提要

本文介绍了在CentOS和Debian上安装和使用cron定时任务的基本方法,包括cron的组成部分、配置文件位置、常用命令及其与systemd定时器的比较,详细说明了cron表达式的用法和示例,并提及Windows计划任务的相关操作和创建方法。

🔎

延伸解读

cron 的 60 秒扫描机制与无状态特性

cron 每 60 秒扫描一次配置文件,且不记录任务上次运行状态,因此无法实现秒级任务,也不会判断任务成功与否。这解释了为何 cron 表达式最小粒度是分钟。若需秒级调度,可考虑 systemd timer 或通过 bash 脚本循环实现隔秒运行。

systemd timer 与 cron 的关键差异

systemd timer 支持秒级触发,且配置更灵活,接近 Windows 计划任务的功能。它通过 service 和 timer 单元配合工作,可使用 systemctl 命令管理。相比之下,cron 实现简单但功能有限,适合传统分钟级任务。

Windows 计划任务的创建方式与注意事项

Windows 计划任务可通过 schtasks 命令、PowerShell cmdlets 或图形界面创建。一个任务可包含多个触发器,但 schtasks 命令只能设置一个触发器。若运行脚本时弹出黑框,可以管理员权限生成任务或以 System 用户运行来隐藏。

在 Windows 上模拟 cron 的可行路径

要在 Windows 实现 cron 功能,需一个每分钟扫描配置文件的程序,可借助计划任务每分钟运行一次,或让程序以服务形式常驻。解析 cron 表达式可使用现成库,但 @reboot 需通过系统启动时间判断,且锁定、注销、睡眠等不计入停机时间。

❓

Q&A

如何在CentOS和Debian上安装cron?

在CentOS上使用命令:yum install vixie-cron crontabs;在Debian上使用命令:apt-get install cron。大多数发行版都会自带cron。

cron表达式中的特殊时间格式如@yearly代表什么?

@yearly表示每年运行一次,等价于0 0 1 1 *;类似的还有@monthly(每月一次)、@weekly(每周一次)、@daily(每日一次)、@hourly(每小时一次)和@reboot(系统启动时运行一次)。

为什么cron无法实现秒级定时任务?

因为cron在代码中固定为每60秒扫描一次配置文件,且不判断单个任务的状态(如上次运行成功与否或运行时间),所以无法支持秒级任务。

如何使用bash脚本实现cron任务的单例运行?

可以使用flock命令通过文件锁确保同一时间只有一个脚本实例运行。例如:使用exec 99>"$LOCK_FILE"和flock -n 99,如果加锁失败则退出。

systemd timer与cron相比有哪些优势?

systemd timer可以实现秒级任务,而cron不能;systemd timer比cron更灵活,基本接近Windows的计划任务。

在Windows中如何创建每分钟运行一次的计划任务?

可以使用schtasks命令:schtasks /create /sc minute /mo 1 /tn "task name" /tr "command";或者使用PowerShell的Register-ScheduledTask命令,结合New-ScheduledTaskTrigger和New-ScheduledTaskAction。

🏷️

标签

➡️

继续阅读