我是使用cron和crontab安排任务的新手。我正在尝试安排任务的执行,就好像我已经登录,打开一个终端,并自己执行它。
但是,我安排了一项任务来帮助我观察正在执行的$ 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是非常基本和/或默认的东西。相反,这是我打开终端(登录)并回显相同信息时看到的内容:
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任务以我想要的方式运行?
答案 0 :(得分:76)
根据“man 5 crontab”,您可以在crontab中设置环境变量,方法是在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
# m h 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或任何环境变量调整为您想要的任何值。但这个例子对于典型案例似乎已经足够了。
答案 1 :(得分:15)
在* ix中,进程通常通过fork + exec从父进程继承环境。他们可以选择清理环境,但通常他们不会。您可以使用ps axf查看进程树,并且可以使用ps axfe查看环境变量。
cron通常不是某人的shell的子项,因此它通常与您的交互式shell具有不同的环境。尽管如此,cron很可能会以某种方式故意清除自己的环境。
我喜欢在交互式shell中使用以下内容测试我的cron作业(为了讨论而使用“foo”): env - ./foo 这实际上将清除cron所做的更多env变速器,但它使得IMO变得更容易,因为你测试的更相似。你需要设置你所依赖的任何变量(比如$ PATH),或者用其他东西替换它们 - EG $ USER变成$(whoami)。
我也喜欢编写我的bash脚本来使用“set -eu”和“set -o pipefail”。 -eu表示“退出非零退出代码,退出未定义的变量引用”,并且pipefail说“不返回管道中的最后一个退出代码,而是返回管道中非零的第一个退出代码” 。在您的情况下,set -u可能特别有用。
答案 2 :(得分:4)
请记住crontab是守护程序或服务,因此不像用户登录或其他东西。如果您想拥有环境变量,则需要自己设置它们。但是,大多数这些变量都是由/ etc / profile路径中的shell设置的,然后进入$ HOME目录中的自定义变量。
您可以通过“搜索”/ etc / profile来设置其中一些内容,例如:
41 11 * * * /home/<me>/cron_env.sh
cron_env.sh
将包含以下内容:
#!/bin/sh
source /etc/profile
/usr/bin/env > /home/<me>/cron_env.log
答案 3 :(得分:3)
在我们的环境中,我们通常不会遇到此问题,因为root是唯一允许的cron,并且每个命令通常作为特定于应用程序的用户运行,并通过su -c命令运行:
su - myuser -c "/usr/local/scripts/app.sh" 2>&1
因为&#34; - &#34;指定了选项,我们获得了myuser的个人资料和环境。我们最近遇到了一个需要root权限才能成功完成的命令的问题,因此我们只发出了没有su -c的命令。经过一些研究后,我们明白了获得root环境的最简单方法是使用与root相同的技术,因为我们发布了以下内容:
su - root -c "/usr/local/scripts/app.sh" 2>&1
答案 4 :(得分:0)
crontab不是bash脚本,不能使用shell中通常可用的环境变量。
尝试将所有代码移动到一个shebang'ed脚本文件中(一个以“#!/ bin / bash”行开头)并在crontab中运行该脚本。
我不确定,但我认为PATH(如果你设置它可能是EMAIL)可能是你可以在crontab文件中访问的唯一一个。
编辑:检查crontab 5 man page,有很多可用的环境变量,全部由cron守护进程设置。