Linux 黑话解释:什么是定时任务
<p><img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/293674e3ba342946add1b0ce811fadb5.jpg" width="auto"></p>
<p>
在本期的《Linux 黑话解释》系列文章中,你将了解到 Linux 中的<ruby>定时任务<rt>cron job</rt></ruby>功能。你将通过学习编辑 <code>crontab</code> 文件来创建定时任务。</p>
<h3 class="mume-header" id="%E4%BD%95%E4%B8%BA%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1">
何为定时任务</h3>
<p>
<code>cron</code> 是一个用于按计划运行短小且快速的命令的实用命令行工具。该工具是一个方便、经典的系统管理工具,通过和其他工具结合使用可以自动运行各式各样的任务。比如,有些人通过把 <code>rsync</code> 和 <code>cron</code> 结合使用,在特定的时间自动创建每日备份和每周备份。也有些人使用 <code>cron</code> 来分析服务器日志,并且结合邮件系统功能,在日志检测到错误时自动发送告警邮件。</p>
<p>
<code>cron</code> 就如同“瑞士军刀”一样,可以多场景多样化使用。尽可能发挥你的想象,去挖掘它的功能。</p>
<p>
其实 <code>cron</code> 的使用很容易上手,只需要几秒钟。不过在我们开始上手之前,先来讨论下几个经常容易混淆的概念。</p>
<h3 class="mume-header" id="cron-%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1-crontab">
cron、定时任务、crontab</h3>
<p>
有三个术语比较容易混淆:<code>cron</code>、定时任务和 <code>crontab</code>,让我们来看看它们的含义:</p>
<table border="1" cellpadding="4">
<thead><tr>
<th>
术语</th>
<th>
含义</th>
</tr></thead>
<tbody>
<tr>
<td>
<code>cron</code>
</td>
<td>
这是安装在系统上的实际执行定时任务的 守护进程。</td>
</tr>
<tr>
<td>
定时任务</td>
<td>
“任务”是指一段启动并运行的程序。<code>cron</code> 可以按照约定的时间计划运行各种任务,这样的任务通常叫做“定时任务”。</td>
</tr>
<tr>
<td>
crontab</td>
<td>
这是一个文件,用于定义定时任务。一个 <code>crontab</code> 文件可以通过表格形式(每一行就是一个定时任务)定义多个定时任务。</td>
</tr>
</tbody>
</table>
<p>
来看一个简单例子:创建一个定时任务,每小时向 <code>crontabl_log.txt</code> 文件打印 <code>Linux is cool!</code>。</p>
<ol class="linenums">
<li class="L0">
<code><span class="lit">0</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="kwd">echo</span><span class="pln"> </span><span class="str">"Linux is Cool!"</span><span class="pln"> </span><span class="pun">>></span><span class="pln"> </span><span class="pun">~/</span><span class="pln">crontab_log</span><span class="pun">.</span><span class="pln">txt</span></code>
</li>
</ol>
<p>
是不是这么个简单定时任务的例子都让你感到惊恐,这是因为你需要懂得如何去读懂一个定时任务的属性。</p>
<p>
我将在后文中讲述这个基础理论知识。</p>
<h3 class="mume-header" id="%E4%B8%8A%E6%89%8B-cron">
上手 cron</h3>
<p>
我们通过另一个例子来看看 <code>cron</code> 如何工作。</p>
<p>
为了创建定时任务(或者说 <code>cron</code> 将要执行的命令任务),你只需要运行:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">crontab </span><span class="pun">-</span><span class="pln">e</span></code>
</li>
</ol>
<p>
这将会打开一个文件,用于编辑定时任务:</p>
<p>
<img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/20ce0f38bd0f305c4fecdda95b4fd177.jpg" width="auto"></p>
<p class="article_img_desc">
<em>Crontab default view</em></p>
<p>
其中,所有以 <code>#</code> 开头的行都是注释,用于指导你如何使用 <code>cron</code>,如果觉得没用可以删除它们。</p>
<p>
我们将创建如下任务,作为我们的第一个定时任务:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="kwd">touch</span><span class="pln"> </span><span class="pun">~/</span><span class="pln">crontab_test</span></code>
</li>
</ol>
<p>
让我快速看看该任务将会做什么:</p>
<p>
定时任务都是以 “分钟 小时 天 月 周 命令” 形式呈现:</p>
<ul>
<li>
分钟:指该任务在哪一分钟会被执行。所以,该值为 <code>0</code> 则代表在每个小时开始时运行,<code>5</code> 则代表在每个小时的第 5 分钟会运行。</li>
<li>
小时:指该任务在一天中的哪个小时会被执行,取值范围为 <code>0-23</code>。没有 <code>24</code> 的原因是 <code>23</code> 时的末尾是半夜 <code>11:59</code>,然后就是每天的开始 <code>0</code> 时。分钟的取值范围定义逻辑与之类似。</li>
<li>
天:指一个月中的哪一天执行该任务,取值范围是 <code>1-31</code>(不同于前面的分钟和小时从 <code>0</code> 开始取值)。</li>
<li>
月:指该任务在哪个月被执行,取值范围是 <code>1-12</code>。</li>
<li>
周:指该任务在星期几被执行,从周日开始算起,取值范围是 <code>0-6</code>(分别对应周日、周一到周六)。</li>
<li>
命令:是你想要运行的命令任务。 </li>
</ul>
<p>
<img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/7c7bdc68b8a7821a767733428ec16f4a.jpg" width="auto"></p>
<p>
如果想对 “分钟 小时 天 月 周” 部分有更详细的理解,可以参考 Crontab guru 网站,该网站可以帮助你理解正在执行什么。</p>
<p>
接着之前的例子 <code>* * * * * touch ~/crontab_test</code>,表示每分钟创建一次 <code>~/crontab_test</code> 文件。</p>
<p>
让我们将该任务编辑进 <code>crontab</code> 然后看看执行结果:</p>
<p>
<img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/f79a701ff0161507ba68b104de508bf3.jpg" width="auto"></p>
<p>
等到下一分钟,你就会发现你的家目录下多了文件 <code>crontab_test</code>:</p>
<p>
<img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/6a3da83ebdab6eb20a1f231164abb3e2.jpg" width="auto"></p>
<p class="article_img">
</p>
<p>
这便是 <code>cron</code> 的基础应用示例。</p>
<h3 class="mume-header" id="%E4%B8%80%E4%B8%AA%E5%AE%9E%E7%94%A8%E7%9A%84%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%A4%BA%E4%BE%8B">
一个实用的定时任务示例</h3>
<p>
假设你想创建一个脚本,用于拷贝多个目录内容到一个路径并打包作为备份,该如何实现?</p>
<p>
通过 <code>cron</code> 定时任务就可以很容易实现该功能。</p>
<p>
请看如下脚本:</p>
<ol class="linenums">
<li class="L0">
<code><span class="com">#</span><span class="pun">!</span><span class="str">/usr/</span><span class="pln">bin</span><span class="pun">/</span><span class="kwd">bash</span></code>
</li>
<li class="L1">
<code><span class="kwd">echo</span><span class="pln"> </span><span class="str">"Backing up..."</span></code>
</li>
<li class="L2">
<code><span class="kwd">mkdir</span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="pun">~</span><span class="str">/.local/</span><span class="pln">tmp</span><span class="pun">/</span></code>
</li>
<li class="L3">
<code><span class="kwd">tar</span><span class="pln"> </span><span class="pun">-</span><span class="typ">Pc</span><span class="pln"> </span><span class="pun">~</span><span class="str">/Documents/</span><span class="pln"> </span><span class="pun">-</span><span class="pln">f </span><span class="pun">~</span><span class="str">/.local/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">backup</span><span class="pun">.</span><span class="pln">gz</span></code>
</li>
</ol>
<p>
该脚本做了如下事情:</p>
<ol>
<li>
确保备份路径目录 <code>~/.local/tmp/</code> 存在。</li>
<li>
将目录 <code>~/Documents/</code> 下的所有内容打包至文件 <code>~/.local/tmp/backup.gz</code>。</li>
</ol>
<p>
我们先来手动运行该脚本,看看它到底如何工作。</p>
<p>
首先,我们在家目录(<code>~</code>)下创建该脚本,命令为 <code>backup_script</code>,如下图所示:</p>
<p>
<img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/ca10d351c4a225f1b519203e79c18f59.jpg" width="auto"></p>
<p>
然后编辑 <code>backup_script</code> 脚本,写入上面那个脚本代码。</p>
<p>
接着,赋予 <code>backup_script</code> 可执行权限:</p>
<p>
<img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/5999a7da2bafbe558f28046a6d6024ca.jpg" width="auto"></p>
<p>
最后运行脚本 <code>~/backup_script</code>,进行功能验证:</p>
<p>
<img title="Linux 黑话解释:什么是定时任务" alt="Linux 黑话解释:什么是定时任务" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/2e3c1c63400ef022a77cf876d8065668.jpg"></p>
<p>
你可以通过运行命令 <code>tar -xf ~/.local/tmp/backup.gz -C <output_dir></code> 来进行备份恢复,这里 <code><output_dir></code> 是指文件要恢复到的路径目录。</p>
<p>
接下来,就可以用 <code>cron</code> 工具来进行定时任务运行该脚本了。</p>
<p>
举个例子,假设需要每天的凌晨 3 点运行该备份脚本,你可以在 <code>crontab</code> 中输入如下命令:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">~/</span><span class="pln">backup_script</span></code>
</li>
</ol>
<p>
这样你就可以每天自动进行备份操作了。</p>
<h3 class="mume-header" id="%E5%90%8E%E8%AE%B0">
后记</h3>
<p>
本文简单介绍了定时任务功能。尽管我不确定 Linux 桌面用户使用该功能多不多,但我知道定时任务功能被许多系统管理员广泛应用。</p>
<p>
原文链接:https://linux.cn/article-14085-1.html</p>
頁:
[1]