如何在Linux中使用Crontab自动执行重复性任务

利用crontab Linux命令自动执行各种普通的重复性任务,从而简化您的生活。这个出色且易于使用的工具,加上一些脚本,不仅可以自动化各种任务,而且还可以避免简单的人为错误或健忘。

在这里,您将了解什么是crontab,如何添加自动化作业以及一些实际示例。

什么是Crontab?

Crontab是一个守护进程,几乎在所有Linux机器上都在后台运行,用于按设置的时间间隔计划和执行自动化任务。软件开发人员还经常使用它在后台运行耗时的任务。

这可以包括但不限于发送批处理电子邮件,检查您的Twitter feed,执行备份或仅执行提醒。

基本的Crontab命令

计算机上的每个Linux用户都有自己的crontab文件,其中包含其活动的crontab作业。以下是一些基本的终端命令,您将使用它们来查看和修改crontab文件:

  • crontab -l —列出所有crontab作业。
  • crontab -e —编辑crontab文件。
  • crontab -r —从crontab文件中删除所有条目。

上面的命令将用于当前用户的crontab文件。如果需要修改其他用户的crontab文件,只需使用-u选项。例如,您可以使用以下命令编辑jdoe用户的crontab文件:

 sudo crontab -ujdoe -e

Crontab作业的格式

每个crontab作业都由一行组成,其格式如下:

 MINUTE HOUR DAY MONTH WEEKDAY COMMAND

下表说明了crontab作业的不同元素:

元件 牧场 描述
分钟 0-59 执行crontab作业的分钟。
小时 0-23 执行crontab作业的时间。
1-31 在哪个月份执行crontab作业。
1-12 执行crontab作业的月份。
平日 0-6 在星期几执行crontab作业。
命令 您可以在终端上执行的任何Linux命令。

您可以在任何字段中使用星号(*)表示通配符,这意味着crontab作业将在该时间段内执行。例如,下面的crontab作业将每天晚上凌晨3:20执行:

 20 3 * * * /root/backup.sh

多个值

每个时间段还可以包括多个元素。您可以使用逗号分隔来指定确切的值,以下crontab作业将在每小时的20和50分钟后每小时执行一次:

 20,50 * * * * /path/to/command.sh

但是,如果要在一个时间段内以特定间隔执行crontab作业,则可以使用* / PERIOD ,下面的crontab作业将在每三个小时的每小时15分钟后自动执行:

 15 */3 * * * /path/to/command.sh

保持Crontab作业安静

视情况而定,您可能希望消除crontab作业的所有输出,以使它们不会最终出现在系统的邮件文件夹中。您可以通过将> / dev / null 2>&1附加到任何crontab作业中来执行此操作。例如:

 0 6 15 * * /path/to/backup.sh > /dev/null 2>&1

添加Crontab作业

通常,添加或修改crontab作业最常用的方法是crontab -e命令。在终端中运行以下命令:

 crontab -e

这将打开带有crontab文件内容的文本编辑器,例如nano 。每个crontab作业都驻留在一行上,您可以根据需要添加,修改和删除行。完成后,按Ctrl + W并按YEnter键保存并关闭文件,这将立即激活文件中的所有crontab作业。

添加作业的快捷方式

您可以运行一个快速的单个命令来添加作业,而不是手动修改crontab文件。例如,如果要添加此crontab作业,该作业在每个星期日的2:00 pm运行:

 0 14 * * 0 /path/to/command.sh

您可以使用单个命令将作业添加到crontab文件中:

 (crontab -l; echo "0 14 * * 0 /path/to/command.sh";) | crontab

上面的命令仅列出crontab文件中当前的所有作业,打印新作业,然后将所有内容输送到crontab中以替换其内容。

列出/删除Crontab文件

您可以使用以下命令列出crontab文件中当前活动的所有作业:

 crontab -l

您也可以删除所有crontab作业,并使用以下命令清空crontab文件的内容:

 crontab -r

示例:播放声音!

在工作时需要每两个小时快速提醒一下您已经过去了吗?可以以几乎任何格式(.wav,.mp4或任何格式)获取您喜欢的音频剪辑,如果保存在(例如) /home/myuser/myalert.wav中,则可以使用crontab作业自动播放它:

 0 */2 * * * aplay /home/myuser/myalert.wav

每周星期五下午5:00自动播放您喜欢的歌曲,如何让您轻松完成本周的工作呢?拿起您喜欢的歌曲剪辑,如果保存在例如/home/myuser/friday_song.mp4上,则将添加crontab作业:

 0 17 * * 5 aplay /home/myuser/friday_song.mp4

示例:使用Rsync备份文件

crontab的许多出色用途之一是能够将文件自动备份到远程服务器。这款出色的rsync教程大大降低了再次丢失重要数据的风险。

示例:检查网站是否在线

也许您想每隔五分钟自动检查一下各个站点是否在线,如果有故障请通过电子邮件通知。这是一个漂亮的小PHP脚本,可以完成此操作。

 
<?php
// E-mail address to notify of sites down
$email = '[email protected]';
// Define URLs to check
$urls = [
'https://apexpl.io',
'https://google.com',
'https://some-junk-site-that-will-hopefully-never-exist.com'
];
// Go through URLs
$down = [];
foreach ($urls as $url) {
// Check URL
$status = check_url($url);
if ($status != 200) {
$down[] = $url;
}
}
// Send e-mail if we have down sites
if (count($down) > 0) {
mail($email, "Urgent - Sites Down!", "Your bot has detected the following sites are currently down:
" . implode("
", $down));
}
// Exit
exit(0);

/**
* Check URL
*/
function check_url(string $url):int
{
// Send via cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
// Get status, and close connection
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Return
return $status;
}

只需修改电子邮件地址和所需的URL以检查文件顶部,然后将其保存在/home/myuser/check_sites.php之类的位置。要使此脚本每五分钟运行一次,并通过电子邮件通知您出现故障的任何站点,请添加crontab作业:

 */5 * * * * /usr/bin/php /home/myuser/check_sites.php > /dev/null 2>&1

自动化生活!

通过本文,您将有望了解crontab的自动化功能,以及如何使用它来自动化生活中许多平凡而又重复的任务。

您已经了解了crontab是什么,有关crontab文件,如何格式化crontab作业以及如何使用它的一些实际示例。