Cron作业是Linux操作系统中一个基本但功能强大的工具。这些基于时间的作业调度器对于系统管理员、开发人员和技术爱好者来说都是必不可少的,可以实现日常任务的自动化。
本文旨在揭开cron作业的神秘面纱。它提供了一个全面的指南,解释了什么是cron作业,它们是如何工作的,最重要的是,如何使用它们来自动化Linux系统上的重复任务。
因此,无论您的目标是设置自动备份文件、在特定时间运行脚本,还是自动化您的个人项目,本文都将向您展示cron作业是如何实现这一切的。所以,让我们一起潜水吧!
克朗是什么?
Cron是类Unix操作系统(包括Linux和macOS)中基于时间的作业调度程序。它允许用户安排作业(命令或脚本)以固定的时间、日期或间隔定期运行。
它最常用于自动执行系统维护或管理任务,但也可用于任何需要定期执行命令的目的。
Cron的工作原理
后台的核心组件是名为crond的cron守护进程。它的主要工作是检查计划任务,并在指定时间到达时执行这些任务。
守护进程每分钟唤醒一次,以检查crontab文件或基于目录的配置中的作业。这自然将我们带到Cron的下一个关键方面,它支撑着它的操作设置——它使用的文件和目录。
Cron文件和目录
Crontab文件是cron作业调度系统的核心。“Crontab”代表“cron-table”,因为这些文件包含要在计划时间运行的命令列表。
crontab文件中的每一行都表示一个单独的作业,并包括关于何时运行作业以及要执行的命令的信息。
从本质上讲,crontab文件有两种:由个人用户拥有的和系统范围内的“
/etc/crontab
”。以下是您应该注意的关于这两个方面的关键细节。
但在此之前,有一些重要的事情需要澄清。属于单个用户的cron文件不保存在其主目录中,而是在“
/var/spool/cron
目录同时,系统服务和应用程序的cron作业文件通常放置在“
/etc/cron。d
“.
用户Crontabs
用户crontab对系统上的每个用户都是个人的。用户可以使用自己的crontab文件在用户ID下安排任务。
用户crontab的主要优点是允许单个用户管理其作业计划,而不需要管理权限。
系统范围Crontab
与特定于用户的crontab文件不同,“
/etc/crontab
”是一个系统范围的配置文件。它遵循与用户crontab稍有不同的格式,包括一个用户字段,该字段指定运行命令的用户帐户。
这允许系统管理员安排作业在任何用户下运行,而无需修改该用户的crontab,从而在不同用户帐户之间的任务管理中具有更大的灵活性。
一般来说,“
/etc/crontab
“文件通常用于需要以管理权限运行或对系统操作至关重要的作业。
另一个重要点是,虽然用户可以编辑他们的crontab条目,但系统范围内的crontab只能由根用户直接编辑。
Cron的目录
除了crontab文件外,大多数Linux系统还包括一组由cron扫描以查找计划作业的目录:“
/etc/cron.daily
,” “
/etc/cron.hourly
,” “
/etc/cron.weekly
和
/etc/cron.monthly
.”
这些目录允许对需要定期运行的任务进行更直接的调度,而无需在crontab中指定确切的时间。
放置在这些目录中的脚本和可执行文件分别每天、每小时、每周或每月运行一次。执行这些目录中的脚本的确切时间由中的配置决定
/etc/crontab
或守护程序的配置文件,通常位于
/etc/cron.d/
.”
Cron语法基础
cron作业由cron文件(crontab)中的一行文本定义。每一行都由一系列字段组成,这些字段由空格或制表符分隔,后面跟着要执行的命令或脚本。cron作业的基本语法如下:
分钟小时日期月份日期星期命令执行
让我们深入研究每个组件:
分钟(0-59)
此字段指定命令运行的分钟数。它可以是0到59之间的值。例如,将其设置为0将在一小时开始时运行该命令。
小时(0-23)
小时字段以24小时格式指定。它决定在一天中的哪个时间执行命令。例如,将其设置为14将在下午2点运行命令。
月日(1-31)
此字段指定命令将在一个月的哪一天运行。它可以是1到31之间的任何值,具体取决于一个月中的天数。例如,将其设置为1将在每个月的第一天运行该命令。
月份(1-12)
月份字段确定命令将在哪个月份执行。它可以是从1(1月)到12(12月)的值。例如,将其设置为12将在12月执行该命令。
星期几(0-6)
此字段指定命令应在一周中的哪一天运行。它可以是0(星期日)到6(星期六)之间的值。例如,将其设置为5将在每周五运行该命令。
命令或脚本
最后,命令或脚本字段是指定cron作业应执行的操作的位置。这可以是cron守护进程将在指定时间执行的任何命令或脚本文件的路径。
Cron语法中的特殊字符
Cron语法还支持特殊字符来指定更复杂的调度模式:
- 星号
:表示“每”个时间单位。例如,小时字段中的“*”表示“每小时”
- 逗号
:允许指定值列表。例如,day_of_week字段中的“1,3,5”表示“在周一、周三和周五运行”
- 连字符
:指定一个值范围。例如,小时字段中的“9-17”表示“从上午9点到下午5点的每小时”
- 斜线
:指定增量。例如,分钟字段中的“*/10”表示“每10分钟”
除此之外,cron作业还有特殊的快捷字符串,可以替换时间和日期的五个字段。这些快捷方式提供了一种快速的方式来指定需要数字表示的相同明细表。
一串
|
意思
|
@重新启动
|
运行指定的命令一次
启动时
.
|
每年的
@每年
|
两者都运行指定的任务
每年
1月1日上午12:00。相当于指定“0 0 1 1*”
|
月刊
|
运行作业
每月一次
,1日上午12:00。相当于“0 0 1**”
|
每周的
|
运行作业
一周一次
周日上午12:00。相当于“0 0**0”
|
每日的
午夜
|
两者都运行cronjob
每一天
这相当于在crontab文件中指定“0 0***”。
|
@每小时
|
在的顶部运行作业
每小时
.相当于“0***”
|
Cron作业何时开始?
cron系统每分钟对crontab运行一次检查。当设置的时间(分钟、小时和月)与实际时间一致时,它会运行任务。此外,它还会检查日期:如果月中的特定日期或星期几与今天匹配,那么是时候执行命令或脚本了。
Cron作业和路径
当cron作业运行时,它是在受限制的环境中运行的,这意味着它不会自动继承用户或系统的环境变量或路径。这可能会导致cron作业失败的问题,因为它由于未定义或不正确的路径而找不到必要的可执行文件或脚本。
有鉴于此,您可以在crontab文件中显式设置PATH环境变量,以处理cron作业中的路径。这告诉cron守护进程在哪里查找可执行文件。例如
路径=
/usr/
箱子
/bin:/u
sr/sbin:
/sbin:/u
sr/local/bin
代码语言:
JavaScript
(
javascript
)
在crontab文件的开头添加这一行可以确保下面的所有cron作业都将在这些目录中搜索可执行文件。
但是,考虑到并遵循最佳实践,我们建议
始终指定所有可执行文件和脚本的绝对路径
以避免任何歧义和潜在错误。
此外,在依赖自动执行之前,请使用crontab中定义的相同路径和环境设置手动运行脚本或命令,以确保它们按预期工作。
设置和管理Cron作业
好吧,现在让我们把理论放在一边。您已经掌握了有关cron作业如何运行及其组件的所有基本知识。现在是时候深入到令人兴奋的部分了:创建一个cron作业任务。
创建用户的Cron作业
要创建或编辑用户的crontab文件,请在终端中使用以下命令:
crontab-e
这是用户创建和编辑cron作业的标准方式。执行时,它通过在为系统设置的默认文本编辑器(如Vi、Nano或其他编辑器)中打开用户的crontab文件,为运行命令的用户编辑cron作业。
如果这是您第一次使用该命令,则可能会提示您在继续操作之前选择一个编辑器。
接下来,要添加cron作业,只需按照上面解释的语法向crontab文件中添加一行新行。例如,我们将安排一个备份脚本,“
备份.sh
,”位于我们用户的主目录中,每天凌晨3:00运行,方法是添加以下行:
0 3.
* * *
家
linuxiac/backup.sh
代码语言:
JavaScript
(
javascript
)
许多以“#”符号为前缀的行,因此在文件开头注释掉,这些行可以作为设置cron作业的简明指南。在它们后面键入您的,如上图所示。
接下来,保存并退出编辑器。请记住,Cron服务会自动检查对crontab文件的更改,并相应地应用这些更改,因此您不需要在进行更改后重新启动它。
最后,值得注意的是使用
crontab-e
提供了在保存和退出文件时自动检查语法的额外好处。Cron将提醒您检测到的任何错误,为防止意外输入无效的Cron作业提供宝贵的保护。
创建系统范围的Cron作业
自从
crontab-e
专注于单个用户的crontab,它不是为某些管理任务可能需要的系统范围的Cron配置更改而设计的。
如果是这种情况,则直接编辑“
/etc/crontab
“文件为您提供了系统范围的crontab功能。与特定于用户的crontab不同,该文件可以包括系统范围的任务,并支持为每个任务指定用户,从而为在不同用户帐户下运行命令提供了灵活性。
例如,让我们创建一个系统范围的cron作业,该作业将使用
日志
“的扩展名”
/var/log/myservice
”目录。
为此,我们首先打开“
/etc/crontab
“使用我们首选的终端编辑器创建文件:
sudo-vim/etc/crontab
然后我们进入cron作业,它看起来像这样:
0 2.
***root/usr/bin/fiund/
var
/log/myservice-类型f-名称
日志
-
删去
代码语言:
JavaScript
(
javascript
)
与用户cron作业不同的是,在最初的五个时间字段后面包含了一个额外的列。此列允许指定执行作业的用户帐户(在本例中为root)。
但是,直接编辑“
/etc/crontab
“文件有两个主要缺点。首先,这种方法不提供语法检查,增加了出错的风险。
第二个原因是“
/etc/crontab
“影响整个系统;不正确的条目可能会产生广泛的影响,可能会影响系统的稳定性或安全性。因此,请谨慎使用。
列出用户Cron作业
为了确保您的cron作业已被正确安排,您可以使用以下方式显示用户的crontab文件内容:
crontab-l
此命令列出为用户安排的所有cron作业,允许您验证或查看要运行的任务集。
列出系统范围内的Cron作业
正如我们已经知道的,系统范围的cron作业存储在不同的位置,并且不在用户的crontab中列出。要列出系统范围的cron作业,您需要查看“
/etc/crontab
“文件和目录”
/etc/cron.d/
,” “
/etc/cron.daily/
,” “
/etc/cron.hourly/
,” “
/etc/cron.weekly/
和
/etc/cron.monthly/
“.
您可以使用查看这些文件
猫
命令或任何文本编辑器。例如
sudo猫/etc/crontab
要列出目录的内容,例如,“
/etc/cron.daily
使用
ls/etc/cron.daily/
列出其他用户的Cron作业
如果您拥有超级用户(root)权限,则可以使用crontab命令和
u
“选项,后跟用户名和”
-l
选项例如,为名为“”的用户列出cron作业
警察
,”你会跑:
sudo crontab-u鲍比-l
对于跨多个用户帐户管理cron作业的系统管理员来说,此命令非常方便。
编辑Cron作业
要编辑cron作业,与创建类似,请使用以下命令在默认编辑器中打开当前用户的crontab文件:
crontab-e
打开crontab文件时,导航到包含要根据需要编辑和修改计划或命令的cron作业的行,然后保存并退出该文件。
如果您需要编辑另一个用户的crontab文件(假设您拥有必要的权限),例如用户的
警察
使用
sudo crontab-u鲍比-e
删除Cron作业
根据您的目标,您有几种方法可以删除cron作业。要仅删除特定作业,请使用
crontab-e
命令打开crontab文件。
从那里,导航到表示要删除的作业的行。通过完全删除该行来删除该行。同时,注意保持所有其他线路不变。之后,保存您的更改并退出编辑器。
但是,如果希望删除用户的所有计划的cron作业,则可以删除用户的crontab文件。此操作将删除所有计划任务,因此应谨慎执行。
打开终端,输入如下所示的命令:
crontab-r
这将在没有确认提示的情况下删除当前用户的crontab文件,因此请确保在执行之前要继续。
如果希望在删除前收到确认提示,请使用以下命令
crontab-i
然后
r
。这将要求在删除crontab文件之前进行确认。
Crontab Cheatsheet
为了总结上面讨论的关于crontab命令的主要选项的要点,下表中简要列出了这些要点。
命令
|
描述
|
crontab-e
|
编辑crontab文件,如果它还不存在,则创建一个。
|
crontab-l
|
显示crontab文件的内容。
|
crontab-r
|
删除整个crontab文件。
|
crontab-u用户
|
当与其他选项配对时,此功能允许修改或查看用户的crontab文件,这是专为具有管理权限的用户保留的功能。
|
如何排除Cron作业的故障
不幸的是,当cron作业无法运行时,根据任务的不同,它可能会令人沮丧,并可能出现问题。因此,以下是一些调查原因的基本指南。
故障排除的第一步是确保正确定义了cron作业。验证是否根据您的要求正确指定了每个字段。一个常见的错误是语法错误或误解了cron如何解释特殊字符和范围。
然后,确保Cron守护进程在您的系统上运行。您可以通过运行以下命令进行检查:
sudo systemctl状态cron
确保cron作业尝试运行的脚本或命令具有适当的权限,并且使用绝对路径。Cron作业在具有最小PATH定义的有限环境中运行,因此指定任何命令或脚本的完整路径至关重要。
此外,该文件必须是可执行的,并且可以由计划cron作业的用户访问。尝试使用cron作业使用的相同用户帐户从命令行手动运行命令或脚本。
这可以帮助您验证该命令在没有cron环境的情况下是否按预期工作。如果命令失败,您就会知道问题出在命令或脚本上,而不是cron上。
请记住,cron作业在非交互式、非登录的shell环境中运行,这意味着它们可能无法访问与手动运行命令时相同的环境变量。
如果脚本依赖于环境变量,则可能需要在脚本开始时或在cron作业定义中显式设置这些变量。
Cron作业示例
最后,我们将介绍几个cron作业示例,这些示例几乎涵盖了所有潜在的cron语法情况。将这些视为打造自己的基础。
命令
|
解释
|
* * * * *
|
每分钟运行一次cron作业。
|
0 * * * *
|
每小时运行一次cron作业。
|
0 0 * * *
|
每天午夜运行cron作业。
|
0 2 * * *
|
每天凌晨2点运行cron作业。
|
0 0 15 * *
|
每月15日午夜运行cron作业。
|
0 0 0 12 *
|
在周六午夜运行cron作业。
|
0 0 * * 6
|
从周一到周五,每天下午3点运行cron作业。
|
0 15 * * 1-5
|
从周一到周五,每天下午3点运行cron作业。
|
5.
|
每5分钟运行一次cron作业。
|
0 8-16 * * *
|
每天、每小时、从上午8点到下午4点执行cron作业。
|
0 4 * * 2,4
|
在周二和周四凌晨4点运行cron作业。
|
@重新启动
|
在系统启动时运行cron作业。
|
此外,像this、this或this这样的在线工具为设置cron任务提供了强大的基于web的界面。
最佳实践和提示
- 手动测试脚本
然后与Cron一起安排他们,以确保他们按预期工作。
- 使用绝对路径
用于crontab文件中的命令和脚本,以避免路径问题。
- 重定向输出
到文件或邮件以捕获任何输出或错误以进行故障排除(“
命令>/path/to/logfile 2>&1
“)。这样,您可以查看日志文件中是否有任何问题。
- 注意系统负载
安排作业时,尤其是在资源密集型作业或同时安排多个作业的情况下。
结论
Cron作业对Linux系统管理至关重要。它们提供了一个强大而通用的工具,用于调度和自动化任务。
它的美妙之处在于它的多功能性和精确性。从以分钟为间隔执行的简单命令到为特定日期和时间安排的复杂脚本,cron可以适应许多需求。
通过将用户和系统范围的crontab文件与指定用于定期任务的目录放在一起,cron作业为单个用户和系统管理员提供了灵活性,可以根据他们的特定需求定制任务调度。
通过利用本文中的见解和示例,您正朝着在Linux之旅中实现调度成功、提高生产力和释放新可能性的方向迈进。
有关其他详细信息,cron和crontab手册页面包含关于cron系统如何工作的全面信息和解释。
谢谢你抽出时间!一如既往,我们非常欢迎您的反馈和意见。
在首次引入 Windows 大约 41 年后,记事本终于更新了自动更正和拼写检查功能。这家科技巨头于今年 3 月推出了拼...
大鱼 2024 年 7 月 9 日
在Ubuntu及其他基于Debian的Linux发行版中,软件包管理是系统维护的一个重要方面。apt和apt-get是两...
大鱼 2024 年 6 月 26 日
远程桌面是一种允许您远程接管和使用另一台计算机的服务。在Ubuntu中,可以在图形客户端机器上启用它来控制主机。此功能对...
大鱼 2024 年 5 月 7 日
利用当天的视频 苹果2024年5月的“放开”活动标志着iPad系列的一个重要里程碑,该公司推出了自成立以来最重大的升级。...
大鱼 2024 年 5 月 19 日
已升级到新iPhone,是否要从旧设备中移动所有照片?或者你只是想从别人的iPhone上转移照片?以下是在两部iPhon...
大鱼 2024 年 5 月 19 日