Ada*_*m S 47 linux cron crontab
我是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
Run Code Online (Sandbox Code Playgroud)
似乎$ 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
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能使我的crontab任务以我想要的方式运行?
Jul*_*ard 77
根据"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 )
Run Code Online (Sandbox Code Playgroud)
因此,您可以将PATH或任何环境变量调整为您想要的任何值.但这个例子似乎足以应对典型案例.
use*_*476 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可能特别有用.
crontab 不是 bash 脚本,您不能使用 shell 中通常可用的环境变量。
尝试将所有代码移至 shebang 编辑的脚本文件(以“#!/bin/bash”行开头)并在 crontab 中运行该脚本。
我不确定,但我认为 PATH(如果您设置了它,也许还有 EMAIL)可能是您可以在 crontab 文件中访问的唯一路径。
编辑:检查crontab 5 手册页,有很多可用的环境变量,全部由 cron 守护程序设置。