
你想每天凌晨两点起床,清理日志、清理临时文件,然后运行相同的服务器维护任务吗?
好吧,我也不想。管理着全球超过 的数百万服务器管理员也不想。
所以,别再胡闹了——我求求你!
Cron 作业就是为此而生的。
因为,说实话,没有什么比沉睡并将脚本为你完成的工作据为己有更能体现“称职的系统管理员”的了。这叫做“利用你的资源”。
有了 Cron 作业:
今天,你将成为一名 Cron 作业专家。
Cron job 本质上是类 Unix 操作系统(Linux、macOS)内置的任务调度程序,可让您在指定的时间和日期自动运行 。
您可以将其想象成服务器的待办事项列表,但……这个待办事项确实会完成。
如果你的服务器基础设施是餐厅:
当时钟到达预定时间时,经理会拍拍被分配员工的肩膀说:“表演时间到了!”
然后,员工会毫无异议地执行他们的任务。
如果我们人类也能如此可靠,世界将会变得截然不同!
每个 Cron 作业都包含两个主要部分:
计划使用一种特定的语法,乍一看可能像是某种计算机魔法:

但仔细观察,你就会明白。
每个星号都可以替换为特定的值、范围或间隔,从而精确地创建你所需的计划。
服务器管理员(甚至包括我)在讨论 Cron 作业时会眼眶湿润是有原因的。
它们将服务器管理变成了(至少在某种程度上)类似于工作与生活平衡的事情。
还记得时间吗?那件你永远觉得不够用的东西?Cron 作业会把时间还给你。你设置了它们,然后就忘记了,而且你几乎从来不会去看它们。
(嗯,直到它们崩溃或者你需要更改计划。)
人类的本性是不一致的。我们会忘记事情。我们会打错字。我们会被猫咪视频分散注意力。而 Cron 作业每次都以完全相同的方式执行完全相同的任务——没有例外。
有了 cron 作业,无论您是醒着、睡着,还是在海滩上啜饮玛格丽塔鸡尾酒,基本维护工作都可以 24/7/365 全天候进行。
当您手动执行任务时,您能准确地记住自己做了什么以及何时做的吗?可能记不住。
但是,您可以配置 cron 作业来记录其活动,从而创建所有自动化操作的纸质记录,以便进行故障排除和验证。
随着您的基础设施规模不断扩大,手动管理所有操作的难度将呈指数级增长。而 cron 作业则可以轻松扩展。
这意味着,同一项作业可以在多台服务器上运行,而无需您投入额外的时间。
理论知识讲得够多了!你需要亲自动手,进行一些实际的 Cron job 设置。
大多数类 Unix 系统都预装了 Cron。要检查它是否可用,请输入以下命令:
crontab -e
根据默认编辑器,该命令将使用您指定的编辑器打开 crontab。如果您以前从未使用过 crontab,它可能会要求您设置默认编辑器。

如果终端显示“command not found”,则需要使用以下命令安装 cron:
sudo apt update && sudo apt install cronsudo yum install cronie完成后,启动并启用 cron 服务:
sudo systemctl start cron sudo systemctl enable cron
使用 start 和 enable 命令,我们将启动 cron 服务来执行 cron 任务。
使用 enable 命令,我们可以确保即使您的服务器重启,cron 服务也会自动重启,并且不会错过任何 cron 任务。
提示:CentOS 将 cron 服务称为“crond”,因此您需要启动并启用 crond 服务。
好的,打开 crontab 或 crontable 开始添加您的计划任务。
系统中的每个用户都可以拥有自己的 crontab 文件。此外,还有一个系统范围的 crontab。
要编辑您的个人 crontab:
crontab -e
这将在您的默认文本编辑器中打开您的 crontab 文件。如果这是您之一次使用,请选择 nano 编辑器(选项 1),因为它最适合初学者。
对于系统级 crontab,请使用 sudo 权限运行以下命令:
sudo nano /etc/crontab

我们之前已经讨论过 Cron 作业的基本结构。
但是,创建 Cron 作业有时会令人困惑。 可以帮助您在输入作业计划时将其可视化。

现在到了有趣的部分——编写我们的之一个 Cron 作业。让我们来看看一些常见的 Cron 作业计划:
每分钟:
* * * * /path/to/command
每小时 0 分钟:
0 * * * * /path/to/command
每天午夜:
0 0 * * * /path/to/command
每周一凌晨 3 点:
0 3 * * 1 /path/to/command
每15分钟:
*/15 * * * * /path/to/command
每月之一天上午 6:30:
30 6 1 * * /path/to/command
让我们开始为您的服务器创建一个简单的备份 Cron 作业。
以下任务每天凌晨 2 点。
0 2 * * * tar -czf /path/to/backup/website-backup-$(date +%Y%m%d).tar.gz /path/to/your/website
它将输出您的网站目录的压缩 tar 存档,并以当前日期作为文件名。
现在,退出编辑器。在 nano 中,按下 Ctrl+X,然后按 Y。
要查看当前的 crontab 并验证您的任务是否已添加:
crontab -l

就这样!您的之一个 cron 作业现已设置完毕,并将在预定时间自动运行。
现在您已经了解了基础知识,让我们来探索一些实用的 cron 作业,它们可以显著简化您作为网站管理员的工作。
MySQL 数据库备份(每天凌晨 1 点):
0 1 * * * mysqldump -u username -p'password' database_name | gzip > /path/to/backups/db-backup-$(date +%Y%m%d).sql.gz
清理超过 7 天的日志(每周日):
0 0 * * 0 find /path/to/logs -type f -name "*.log" -mtime +7 -delete
每 5 分钟检查一次网站响应时间:
*/5 * * * * curl -o /dev/null -s -w "%{http_code} %{time_total}sn" example.com >> /path/to/logs/website-performance.log
获取并更新动态内容(每小时):
0 * * * * /path/to/content-update-script.sh
每周一上午 9 点发送每周流量摘要:
0 9 * * 1 /path/to/generate-and-email-report.sh
每天凌晨 3 点运行安全扫描脚本:
0 3 * * * /path/to/security-scan.sh
为了确保您的 Cron 作业顺利运行,避免问题多于其解决的问题,以下是一些重要的更佳实践。
"/usr/bin/python" 比使用 python 更好。>/dev/null 2>&1 可以抑制输出,或重定向到日志文件。添加注释来解释每个作业——将来您会感谢您记录每个 Cron 作业的功能及其原因。
Daily database backup - Added by Jane on 2023-05-15 0 1 * * * /path/to/backup-script.sh
考虑对长时间运行的作业使用锁文件,以防止在前一个实例仍在运行时启动新实例。
0 * * * * flock -n /tmp/script.lock /path/to/your/script.sh
"./script.sh" 在 cron 中几乎肯定会失败。只有在 Cron 作业中断时才需要回顾它——当它中断时,以下是如何诊断和修复常见问题的 *** 。
症状:您的计划任务似乎根本没有执行。
可尝试的修复 *** :
症状:作业执行但未成功完成其任务。
可尝试的修复 *** :
* * * * /path/to/script.sh > /path/to/script.log 2>&1症状:您的收件箱被 cron 输出邮件淹没。
可尝试的修复 *** :
>/dev/null 2>&1>/path/to/logfile.log 2>&1仅在发生错误时发送电子邮件:
* * * * /path/to/script.sh >/dev/null || echo "Script failed" | mail -s "Cron failure" you@example.com
症状:作业在非预期的时间或频率运行。
可尝试的修复 *** :
我们已经了解了基础知识,现在您已经是 Cron 作业的专家了。但本节将带您更进一步。
您不必总是使用星号来编写 Cron 作业。有一些特殊字符串可以让您轻松设置 Cron 作业。
例如,如果您希望每天运行某些程序,只需输入以下命令:
@daily /path/to/daily-backup.sh
为了避免在 cron 作业中反复重复输入某个字符串(例如,指定路径或管理员邮箱),请在 crontab 的开头设置环境变量。
然后,您可以在脚本或命令中根据需要重复使用这些变量。
SHELL=/bin/bash PATH=/usr/local/ *** in:/usr/local/bin:/usr/ *** in:/usr/bin:/ *** in:/bin MAILTO=admin@example.com # This job will send errors to admin@example.com 0 2 * * * /path/to/mailing_script.sh
如果我们在 mailing_script.sh 中使用环境变量 MAILTO,脚本将自动向正确的电子邮件地址发送电子邮件。
这样,更改管理员电子邮件地址只需更改 MAILTO 变量的值,而无需在所有脚本中进行更改。
如果您拥有,则可以编辑其他用户的 crontab:
sudo crontab -u username -e
与 cron 不同,anacron 即使在计划时间内计算机处于关闭状态,也能确保作业运行:
sudo apt install anacron
编辑 /etc/anacrontab 以添加系统恢复在线时将运行的作业。
按顺序运行作业:
0 1 * * * /path/to/first-script.sh && /path/to/second-script.sh
对于严肃的服务器管理,可以考虑使用 等工具来监控和提醒您的 Cron 作业。
0 * * * * cronitor exec check-12345 -- /path/to/your/script.sh
Cron 作业不能孤立存在。它们需要一台服务器以及运行在服务器上的一项服务,而您需要管理这些服务。
现在,如果您正在阅读这篇文章,那么您很可能已经拥有一台用于运行网站或应用程序的服务器。
事实上,如果您使用 VPS 或任何基于 Linux 的主机提供商,那么您已经具备了开始自动化服务器管理任务所需的一切。
如果没有,那么每月 10 美元的 VPS 就足够了,尤其是在刚开始使用时。
对于已经在使用 VPS 的用户来说,流程非常简单:
就是这样。您已经付费的基础设施突然变得更有价值、更高效。
您已从体力劳动晋升到自动化魔法师的行列。有了 cron 作业处理日常维护、备份和监控,您可以专注于发展网站和业务,而无需操心服务器的日常维护。
请记住,这将是一个过程。随着您添加越来越多的任务,自动化将变得更加复杂。
但现在,请先从几个基本的 cron 作业开始,监控它们的运行情况,并随着您对流程的熟悉逐渐扩展您的自动化功能。
现在,去休息吧,因为您刚刚节省了一大笔时间。
谁在尝试访问某些网站时没有遇到过更新Java的请求? 虽然许多人通过交互式网站功能熟悉Java,但用户可能不太熟悉JavaScript——或者,实际上,他们可能错误地认为两者是相同的。 在本文中,我们将讨论JavaScript 是什么以及Java和JavaScript之间的区别。然后我们将概...
宝塔面板现在已经成为国内许多站长必备的服务器管理必备工具。相比直接使用SSH+FTP来管理服务器,宝塔面板可以提供可视化管理,包括文件管理、数据库管理、数据备份、SSL配置等等。 如果你希望更简单高效地管理您的网站及服务器,宝塔面板是不错的选择。下面是一些宝塔面板安装及常见问题:...
宝塔的数据库管理,是基于phpmyadmin管理和新建数据库。其最大的便利性就是类似,通过面板可以快速访问进行管理操作,无需单独访问phpmyadmin的主页。 此外,在宝塔面板进行数据库管理,你也对数据库名、用户名及密码等信息一目了然,及可以对数据库执行快速备份或者导入。 添加数据...
宝塔面板其中一个最为便捷的功能之一,无需SFTP或者FTP即可对服务器的文件内容进行上传、下载、编辑及删除等管理操作。 文件管理,用于管理该服务器上的文件内容。 文件的基础操作 文件的基础操作有哪些了,主要有这些方面:复制、粘贴、剪切、删除、重命名、压缩、刷新、新建文件、新建目录。...
宝塔面板设置主要涉及的是宝塔控制后台自身的参数,包括诸如面板的开关、自动更新及SSL、面板端口设置等。虽然这部分不涉及服务器自身的管理,但对宝塔面板的设置也有其重要。 特别是面板端口、安全入口及面板密码等涉及安全的参数设置。 启动和关闭面板 如果你长时间无需使用到宝塔面板,可以考虑...
JavaScript是世界上最流行的编程语言之一。今天,它为数百万个网站提供支持,并吸引了成群的开发人员和设计人员为Web构建功能。如果您是编程新手,那么 JavaScript很容易成为之一。 在最初的20年里,JavaScript主要用于客户端脚本。由于JavaScript只能在<scr...