在新安装的 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
。