为什么 cron ENV 与用户的 ENV 不同?

为什么 cron ENV 与用户的 ENV 不同?

在新安装的 Ubuntu 上,用户的权限PATH是:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

但在同一用户的 cron 环境中,它是:

/usr/bin:/bin

我查看了主目录中所有用户的点文件,其中没有任何内容发生改变PATH

什么改变了PATH?为什么 cron 不使用PATH

答案1

关于这个问题 - 为什么会这样 - 解释它的手册页是crontab(5),换句话说,可以通过访问man 5 crontab(不是第 1 节中的默认页面)。 cron 守护程序不会尝试模拟 shell 会话,而是为 cron 作业设置一个干净、最小的环境来运行,然后反过来允许 crontab 文件设置自己的任意环境变量。 Debian 附带的较新的 cron 守护程序还为pam_env等提供了一些额外的规定。

答案2

Cron 不会在登录 shell 中执行进程。因此,所有典型脚本都不会在进程执行时被调用。

从登录 shell 中执行该过程应该复制用户的环境。

将类似这样的内容放入 crontab 中并比较两个输出:

*/1 * * * * /usr/bin/env > /tmp/env                                             
*/1 * * * * /usr/bin/bash -l -c /usr/bin/env > /tmp/bashenv  

如您所见,/tmp/bashenv将拥有一大堆/tmp/env没有的环境变量。这是因为env在登录 shell 中使用 调用了bash -l

相关内容