linux crontab PATH和USER

83qze16e  于 2023-08-03  发布在  Linux
关注(0)|答案(5)|浏览(101)

我是用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任务以我想要的方式运行?

2izufjch

2izufjch1#

根据“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或任何环境变量到任何你想要的。但这个例子对于典型案例来说似乎足够了。

smtd7mpg

smtd7mpg2#

在 *ix中,进程通常通过fork+exec从父进程继承环境。他们可以选择清理环境,但通常他们不会。您可以使用ps axf查看进程树,还可以使用ps axfe查看环境变量。
cron通常不是某个shell的子环境,因此它的环境通常与交互式shell不同。不过,为了保持一致性,cron很有可能会有意地清理自己的环境。
我喜欢在一个交互式shell中用下面的代码测试我的cron作业(“foo”是为了讨论起见):env - ./foo这实际上将清除cron所做的更多env变量,但它使IMO更容易运行,因为您正在测试的内容更相似。你需要设置你所依赖的任何变量(比如$PATH),或者用其他东西替换它们--比如$USER变成了$(whoami)。
我还喜欢编写我的bash脚本来使用“set -eu”和“set -o pipefail”。eu表示“在非零退出代码时退出,在未定义的变量引用时退出”,pipefail表示“不要返回管道中的最后一个退出代码,而是返回管道中的第一个非零退出代码”。在您的情况下,set -u可能特别有用。

wb1gzix0

wb1gzix03#

在我们的环境中,我们通常不会遇到这个问题,因为root是唯一允许的cron,并且每个命令通常都是作为特定于应用程序的用户通过su-c命令运行的:

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

字符串
由于指定了“-”选项,我们得到了myuser的配置文件和环境。我们最近遇到了一个需要root权限才能成功完成的命令的问题,所以我们只是发出了没有su-c的命令。经过大量的研究,我们意识到获得root环境的最简单方法是对root使用与我们对所有其他应用程序相同的技术,因此我们发布了:

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

aij0ehis

aij0ehis4#

请记住,crontab是一个守护进程或服务,所以不像是登录的用户或其他东西。如果你想拥有自己的环境变量,你需要自己设置它们。但是,这些变量中的大多数都是由shell从/etc/profile路径设置的,然后进入$HOME目录中的自定义变量。
您可以通过“采购”您的/etc/配置文件来设置其中的一些,如:

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

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

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

polhcujo

polhcujo5#

crontab不是一个bash脚本,你不能使用shell中通常可用的环境变量。
尝试将所有代码移动到一个shebang'艾德脚本文件中(一个以行“#!/bin/bash”)并在crontab中运行该脚本。
我不确定,但我认为PATH(如果您设置了它,可能还有EMAIL)可能是您在crontab文件中可以访问的唯一一个。

**编辑:**查看crontab 5 man page,有不少环境变量可用,都是cron守护进程设置的。

相关问题