cron 任务中环境变量设置失败

cron 任务中环境变量设置失败

我正在尝试在服务器上安装新的 cron 任务。我可以通过命令行运行该过程,但无法通过 cron 运行它。这是因为当通过 cron 运行任务时,PATH 和 PYTHONPATH 的环境变量未正确设置。(实际上,我在服务器上的所有 cron 作业中都遇到了这个问题,但为了简单起见,我专注于这个问题中的一个过程。)

以下是该过程的 cron 条目:

### procmon NLite ### */2 * * * * . ~/.bashrc; cd /var/networkip/nlite/proc_mon; . bashrc; cd bin; ./proc_mon.py > /dev/null 2>&1

现在,proc_mon 目录中的 bashrc 包含:

BASEDIR=$PWD
KODIAK_ROOT=$BASEDIR/
BASEPATH=$KODIAK_ROOT

pathadd PYTHONPATH ${BASEDIR}/lib

因此,当 crontask 运行时 - PYTHONPATH应该被重置,但是这并没有发生。

有其他几台较旧的服务器通过 cron 成功运行这些进程。
迄今为止尝试的解决方案:

  • 将成功运行 cron 任务的服务器的所有 bashrc 或 bash_profiles 与运行 cron 失败的服务器进行比较
  • 记录环境变量以确认这是问题所在

我不感兴趣的解决方案:

  • 一个 cron 任务来设置环境变量。有几个 procs 需要通过 cron 运行,并且所有 procs 相对于该特定脚本都有不同的 PATH 和 PYTHONPATH 变量。这样做可能会变得非常混乱,而且不是一个好的长期解决方案,因为我会在未来的服务器上安装相同的 procs 和 cron。

更多信息:

  • 服务器的 Linux 发行版 cron 失败:CentOS 版本 6.8
  • 具有 cron 成功的服务器 Linux 发行版:Red Hat Enterprise Linux Server 版本 5.2 (Tikanga)

既然 crons 能够在其他服务器上工作,那么就一定有一个合理的解决方案来解决这个问题。

答案1

如何更改你的命令行/cronjob:

bash -c "PYTHONPATH=/var/networkip/nlite/proc_mon/lib:$PYTHONPATH python /var/networkip/nlite/proc_mon/proc_mon.py > /dev/null 2>&1"

RH5.2 和 RH6.8 之间(更不用说 CentOS)有相当多的差异(我希望我现在有一个来源),包括我认为 cron 守护进程的改变(我认为是从 cron 到 cronie)。

无论如何,您可能还想检查其他一些事项:

  • 检查 seLinux 是否是其中的一部分(在 /var/log/audit/audit.log 中 grep 您的路径,如果您有这样的文件,请检查 AVC)
  • 从 cron 调用一个 bash 脚本,并在该脚本中设置您的环境(而不是使用长 cron cli) - 您可以为此使用 /etc/cron.d。
  • 尝试在干净的环境下运行脚本:env -i PYTHONPATH=/var/networkip/nlite/proc_mon/lib:$PYTHONPATH python /var/networkip/nlite/proc_mon/proc_mon.py > /dev/null 2>&1

您说这种情况发生在“所有 cron 作业”中,所以我会先检查 seLinux。保持启用/强制执行,但使用类似方法audit2allow修复您的特定问题。

也许还值得删除输出到 /dev/null 的重定向,以便您可以看到实际的问题是什么。

相关内容