Cron作业的路径变量
一、概述
在本教程中,我们将学习*cron 环境的PATH变量的外观以及如何为作业提供所需的PATH* 。
2. 说明问题的示例
让我们编写一个简单的 bash 脚本来打印 ‘Hello World’ 并将其命名为hello:
#!/bin/bash
echo "Hello World!"
因为我们将通过在终端中键入“hello”来启动脚本,让我们检查用户joe的PATH变量:
/home/joe/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:
因此,让我们将hello文件复制到*/home/joe/.local/bin*。
2.1. 安排工作
我们将通过 cron 实用程序每分钟运行一次hello脚本,在 crontab 中有一个条目:
* * * * * hello >> /tmp/hello_output 2>&1
Construct 2>&1将错误消息重定向到标准输出。由于后者被重定向到*/tmp/hello_output*文件,我们可以轻松调试脚本。
现在让我们等待并检查输出文件。结果与我们的预期不同。我们发现一条错误消息,而不是“Hello World”:
/bin/sh: 1: hello: not found
失败的原因是 cron不知道*/home/joe/.local/bin*文件夹。因此,它找不到脚本。
让我们通过安排另一个作业来打印 cron 环境的PATH :
* * * * * echo $PATH >> /tmp/path_output
看看输出:
/usr/bin:/bin
很明显,使用PATH=/usr/bin:/bin, cron 很容易找到echo 命令,但找不到hello脚本。
cron 实用程序在 shell 中运行命令,它具有与此不同的环境变量PATH ,它是在用户的 shell 中定义的。
3. 将PATH传递给 Cron 作业
让我们看看为 cron shell提供PATH变量的方法。
3.1. 在 Crontab 中定义PATH变量
** crontab -e命令不仅可以定义作业,还可以设置 cron 环境的变量。**
我们应该在任何作业条目之前定义变量。此外,这样的变量会影响用户的 crontab 的所有作业。
让我们改进我们的示例并检查PATH:
PATH=/usr/bin:/bin:/home/joe/.local/bin/
* * * * * echo $PATH >> /tmp/path_output
之后,我们找到用户本地bin文件夹的正确路径。同样,** hello脚本现在可以完美运行。**
这种方法具有我们应该意识到的缺点。
请注意,我们明确键入了整个路径,包括系统范围和本地部分,而没有使用常见的习惯用法PATH=$PATH:/home/joe/.local/bin/,因为 cron 的某些实现不扩展 bash 变量, 用美元符号*$*表示。
因此,我们最终将PATH作为纯文本*$PATH:/home/joe/.local/bin*。
因此,*许多位于/usr/bin或/bin*中的 Linux 命令对于我们的脚本将不可用,**这可能会带来灾难性的影响。 另一个缺陷是某些 cron 实现根本不允许在 crontab 中定义变量。
3.2. 将PATH变量定义为作业的一部分
我们不在 crontab 中设置变量,而是定义PATH变量并调用我们的hello脚本:
* * * * * export PATH=$PATH:/home/joe/.local/bin/; hello >> /tmp/hello_output 2>&1
在这种情况下,调用运行作业的 bash shell 负责扩展 cron PATH变量,该变量出现在分配的右侧。
当然,路径的显式形式也是适用的。
使用这种方法,每个 crontab 条目都可以有自己的PATH,彼此分开定义。
3.3. 配置文件中的PATH变量
处理PATH和其他环境变量的更灵活的方法是在文件中定义它们或重用用户和系统设置。
有关这些方法的全面描述,请阅读我们关于如何在cron作业中加载环境变量 的教程。