【问题标题】:Crontab Source Filecrontab 源文件
【发布时间】:2012-02-08 02:27:54
【问题描述】:

最近我创建了一个我应该在 cron 中运行的 bash 脚本。

在准备好 bash 脚本并使其正常工作后,我将其放入 Cron 中,发现它失败了。作为第二步,我删除了所有环境依赖项,即我指定了file.txt 而不是/home/blah-blah/file.txt

我仍然发现脚本仍然有一步失败。该步骤是一个数据处理工具。 我执行的命令是/bin/blah-blah/processing_tool -parameter $INDEX,其中$INDEX 是在bash 脚本中计算的变量。

第三步是在 bash 脚本的开头添加 bash 配置文件作为源。瞧!!!!脚本从 cron 开始完美执行。

我的问题是为什么即使在我从脚本中删除了所有环境依赖项之后也会发生这种情况。此外,我听说不建议将 cron 作业采购到 bash 配置文件。如果是这样,有没有其他方法可以避免这样做。

【问题讨论】:

  • 你可能错过了什么。尝试set -eu 查找问题。使用set -x 进行调试输出。有关说明,请参阅 help set
  • "bash 配置文件到脚本的开头" 或 #!/bin/bash 到脚本的开头?
  • @Sriram : #!/bin/bash 已添加。一行“source .profile”解决了这个问题。我想知道为什么。 @Ceving:我已经尝试过使用 set -x 进行调试。但是没有看到任何明显的差异。会再试一次。

标签: linux crontab


【解决方案1】:

基本上:从 cron 开始的任何事情都从完全干净的状态开始。 在从 cron 运行的任何脚本开始时,您不能对环境变量的内容或当前文件夹的内容做出任何假设。

最简单的解决方案: cd 到所需的目录以确保您的路径位于所需的位置。 source /etc/profile 以确保您获得系统范围的环境变量设置。 source ~myuserid/.profile 来读取你的个人环境设置。 (~/.profile 不起作用,因为这表明 cron 用户。) 然后开始执行实际的脚本。 当然,上面的方法需要 cron 进程对你的 home-dir 具有读取权限,并且它可能会做比实际需要的更多的工作。

稍微复杂一点:找出脚本需要哪些环境变量以及脚本调用的任何内容。 在 cron 脚本的开头显式导出这些。

(P.s. 将 /etc/profile 和 ~myuserid/.profile 替换为您选择的 shell 的相应文件。)

【讨论】:

    【解决方案2】:

    cron 可以被认为是一个单独的用户。因此,这个“用户”可能不会像您那样“看到”或“读取”相同的文件。因此,必须以绝对方式定义所有路径名等。

    每个脚本都在自己的进程中运行。因此,当您运行脚本时,您可以更改 $SHELL 和其中的任何其他变量,但一旦退出它就会丢失。我的猜测是 $INDEX 变量计算可能已在脚本内成功计算,但它在脚本外的使用可能已失败。如果没有更多关于它是什么工作或你想做什么的信息,就很难说清楚。

    有两种方法可以运行 cron 作业:

    1. 以 root 身份,您可以在 root crontab 中运行 su -user -c < job >
    2. 明确地获取您的个人资料,就像您所做的那样。
    3. 您还可以在 crontab 中设置环境变量。
    4. 作为用户 crontab 中的用户,您可以像这样运行它:"/home/blah/.profile && myScript"

    也就是说,在您运行 cron 作业时,您的环境变量(除了文件扩展名之外)中一定存在一些不存在的内容。您必须使用-x flag (in bash) 执行该脚本,然后仔细研究输出。在您的环境变量和root/cron 之间使用diff 可能是一个指针。另外,检查脚本中是否有一些实用程序的位置不属于 cron/root 的$PATH 变量。

    【讨论】:

    • 不,不应将 cron 作业视为单独的用户(如果它至少是用户 cronjob;系统作业可能是不同的用户)。当您从 cron 运行 shell 脚本时,它不会读取您的登录脚本(因为它不是登录 shell)或 bashrc(因为它不是交互式 shell)。但它是同一个用户。例如,如果您将其视为不同的用户,您将永远无法理解它是如何与文件系统权限交互的。
    猜你喜欢
    • 2021-10-11
    • 2011-09-15
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多