脚本与日志的调度

ShellBeginner
立即练习

简介

假设你有一个机器人,会在你睡觉时打扫房子。因为你正在睡觉,看不到机器人工作。醒来后,你怎么知道它确实打扫过,还是卡在了沙发下面?

答案是:让机器人记一本日志。

在 Linux 中,自动化脚本通常在后台运行,或者由调度器启动,运行时没有人查看终端。因此,仅依靠屏幕输出是不够的。为了记录发生过什么,我们会将输出写入日志文件。

这是自动化中最简单、但非常有价值的习惯之一。没有日志的脚本可能会静默失败;有日志的脚本则会留下证据。

在本实验中,你将学习:

  1. 重定向输出:让脚本将内容写入文件,而不是显示在屏幕上。
  2. 保留历史记录:使用追加运算符添加新记录,而不删除旧记录。
  3. 添加时间戳:确保每条日志记录都包含日期和时间。

将输出追加到日志文件

普通脚本会立即将输出显示在屏幕上,就像面对面交谈一样。但如果没有人在监听(自动化脚本通常就是这种情况),这些内容就会永远丢失。

我们需要将这些内容保存到文件中。这里要使用重定向运算符。

这与之前学过的 shell 概念直接相关:命令通常会将内容写入标准输出,而重定向可以改变输出的去向。在自动化场景中,日志记录就是这一机制的实际应用。

  • >(覆盖):「擦掉日志,重新写一页。」(不适合保留历史记录)
  • >>(追加):「找到下一行空白位置,从那里继续写。」(适合保留历史记录)

先查看已经准备好的简单脚本:

cat myscript.sh

脚本只会显示「The script is running」。如果现在运行它(./myscript.sh),消息会显示在屏幕上。

现在将它修改为把内容写入名为 script.log 的日志文件。

打开脚本:

nano myscript.sh

修改该行,使用 >> 运算符。

实用建议:写入日志时始终使用绝对路径(完整路径),例如 /home/labex/project/script.log。这样,即使脚本从其他位置运行,日志也不会被写入某个不确定的目录。

这一习惯很重要,因为计划任务的工作目录可能与交互式 shell 中预期的目录不同。如果脚本在没有指定路径的情况下写入 script.log,文件可能会被创建在错误的位置。

修改后,文件应如下所示:

#!/bin/bash
echo "The script is running" >> /home/labex/project/script.log

保存并退出。

现在运行脚本:

./myscript.sh

你不会看到任何输出。

脚本确实运行了,但没有向屏幕显示任何内容,而是将消息写入了日志。

检查日志:

cat script.log

你应该能看到消息已经安全地保存在文件中。

添加时间戳

如果一条日志只描述「发生了什么」,却没有说明「什么时候发生」,那么它的作用就很有限。假如脚本每天运行一次,持续一年,日志文件中可能只有 365 行完全相同的「The script is running」。

我们需要添加时间戳。Linux 提供了一个名为 date 的命令,可以输出当前时间。我们也会将它重定向到日志文件中。

这是实现可观测性的起点:留下足够的证据,让人之后能够还原发生过什么。即使是非常简单的时间戳,也能显著提高排查自动化任务问题的能力。

打开 myscript.sh:

nano myscript.sh

将 date 命令添加到消息之前。这样,日志会先显示时间,再显示执行的操作。

#!/bin/bash
date >> /home/labex/project/script.log
echo "The script is running" >> /home/labex/project/script.log

保存并退出。

再次运行脚本:

./myscript.sh

检查日志:

cat script.log

现在,你应该会看到类似下面的内容:

The script is running
Fri Oct 27 10:00:00 UTC 2023
The script is running

(第一行来自之前的测试。)

现在,每次操作都会记录精确的时间。这样,你就能向老板证明自动化备份确实在凌晨 3 点运行过!

在更大的系统中,日志还可以帮助回答一些更复杂的问题,例如脚本是否运行了两次、是否执行到一半就停止,以及两次运行之间间隔了多长时间。良好的日志可以将不可见的自动化过程变成可检查的记录。

验证日志历史记录

现在测试「追加」的效果。如果使用的是 >(覆盖),而不是 >>(追加),日志文件就不会持续增长,而实际上只会显示最近一次运行的结果。

只要脚本会重复运行,这一区别就很重要。覆盖适合生成当前状态的快照;而追加通常更适合保存历史记录,因为它能保留事件发生的顺序。

现在模拟脚本在一天内多次运行的情况。

连续运行三次:

./myscript.sh
./myscript.sh
./myscript.sh

现在查看日志:

cat script.log

你应该会看到不断增长的日志记录列表,每条记录都有自己的时间戳。排查问题时,这些历史记录非常有价值。如果服务器昨天崩溃了,你可以在日志中回溯到昨天的时间戳,准确查看脚本当时正在执行什么操作。

总结

你已经成功让脚本记录自己的日志。

在本实验中,你学习了:

  1. 重定向(>>):将脚本的「输出」发送到文件中,避免内容丢失。
  2. 追加:保留历史记录,而不是将其擦除。
  3. 添加时间戳:使用 date 记录操作发生的时间。

这是 Linux 中专业服务普遍采用的标准方式。无论是 Web 服务器还是数据库,它们都会像你刚才所做的那样,将信息写入日志文件。