crontab PATH和USER

我是新的计划与cron和crontab的任务。 我试图安排一个任务的执行,就像我已经login,打开一个terminal,并自己执行它。

但是,我安排了一个任务来帮助我观察计划任务正在执行的$ USER和$ PATH,这就是我发现的:

$ crontab -l 41 11 * * * echo "USER: $USER" > ~/Desktop/cron_env.log; echo "PATH: $PATH" >> ~/Desktop/cron_env.log $ cat ~/Desktop/cron_env.log USER: PATH: /usr/bin:/bin 

看起来好像$ USER没有被设置,并且$ PATH是非常基本的和/或默认的。 相反,这是我打开一个terminal(login)时看到的,并回显相同的信息:

 USER: aschirma PATH: /usr/lib/jvm/java-6-sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/pkg/icetools/bin:/pkg/hwtools/bin:/pkg/netscape/bin:/pkg/gnu/bin 

我需要做什么来使我的crontab任务按我想要的方式运行?

根据“man 5 crontab”你可以在你的crontab中设置环境variables,把它们写在你的cron行之前。

还有一个crontab的例子,所以你只需要复制/粘贴它:

 $ man 5 crontab | grep -C5 PATH | tail # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # mh dom mon dow usercommand 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 

所以你可以调整你的PATH或任何你想要的环境variables。 但是这个例子对于典型案例来说似乎足够了

在* ix中,进程通常通过fork + exec从父进程inheritance一个环境。 他们可以select清理环境,但通常他们不会。 您可以使用ps axf来查看进程树,并且可以使用ps axfe来查看环境variables。

cron通常不是某个人的shell的孩子,所以它通常与交互式shell有不同的环境。 有一个很好的机会cron会故意清除自己的环境不知为了一致性。

我喜欢在交互式shell中testing我的cron作业(为了讨论的缘故)(以下简称“foo”):env – ./foo这实际上会清除cron所做的更多env vars,但是它使事情更容易去海事组织,因为你正在testing更相似。 你需要设置你所依赖的任何variables(比如$ PATH),或者用别的东西代替–EG $ USER变成$(whoami)。

我也喜欢写我的bash脚本来使用“set -eu”和“set -o pipefail”。 -eu表示“退出非零退出代码并退出一个未定义的variables引用”,pipefail表示“不返回pipe道中的最后一个退出代码,而是返回pipe道中非零的第一个退出代码” 。 在你的情况下,设置-u可能会特别有帮助。

还记得crontab是一个守护进程或服务,所以不是像login的用户或东西。 如果你想有你的环境variables,你将需要自己设置它们。 然而,这些variables中的大部分都是由shell的/ etc / profilepath设置的,然后进入你的自定义variables到你的$ HOME目录。

您可以通过“采购”/ etc / profile来设置其中的一些:

 41 11 * * * /home/<me>/cron_env.sh

其中cron_env.sh将包含如下内容:

 #!/ bin / sh的
源/ etc / profile
 / usr / bin / env> /home/<me>/cron_env.log

在我们的环境中,我们通常没有这个问题,因为root是唯一允许的cron,每个命令通常作为特定于应用程序的用户VIA运行su -c命令:

 su - myuser -c "/usr/local/scripts/app.sh" 2>&1 

由于指定了“ – ”选项,我们得到myuser的configuration文件和环境。 我们最近遇到了需要root权限才能成功完成的命令,所以我们只是发出了命令而没有su -c。 经过一番研究之后,我们发现获取root环境的最简单的方法就是使用和我们所有其他应用程序相同的技术,所以我们发布了:

 su - root -c "/usr/local/scripts/app.sh" 2>&1 

crontab不是一个bash脚本,你不能使用在shell中通常可用的环境variables。

尝试将所有代码移动到一个脚本文件(一行以“#!/ bin / bash”开头),然后在crontab中运行脚本。

我不知道,但我认为PATH(也许EMAIL,如果你设置它)可能是唯一一个你可以访问内部的crontab文件。

编辑:检查crontab 5手册页 ,有很多环境variablesaviable,所有由cron守护进程设置。