linux-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
似乎没有设置$ 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任务按我的方式运行?
Adam S asked 2020-06-18T09:07:06Z
5个解决方案
77 votes
根据“ man 5 crontab”,您可以通过在cron行之前编写环境变量来在crontab中设置环境变量。
还有一个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或任何环境变量调整为所需的值。 但是此示例对于典型情况似乎足够了。
Julien Palard answered 2020-06-18T09:07:30Z
15 votes
在* ix中,进程通常跨fork + exec从其父进程继承环境。 他们可以选择清除环境,但通常没有。 您可以使用ps axf查看进程树,还可以使用ps axfe查看环境变量。
cron通常不是某个人的外壳的子对象,因此它通常会具有与交互式外壳不同的环境。 但是,cron很有可能会以某种方式有意清除其自身的环境以保持一致性。
我喜欢在交互式shell中使用以下命令测试我的cron作业(出于讨论目的,为“ foo”):env-./foo实际上,这将清除cron所做的更多env var,但是由于要测试的内容更相似,因此它使将事情顺利进行到IMO变得更加容易。 您需要设置要依赖的任何变量(例如$ PATH),或将其替换为其他变量-EG $ USER变为$(whoami)。
我还喜欢编写bash脚本以使用“ set -eu”和“ set -o pipefail”。 -eu表示“退出非零退出代码,然后退出未定义的变量引用”,而pipefail表示“不返回管道中的最后一个退出代码,而是返回管道中非零的第一个退出代码” 。 在您的情况下,设置-u可能特别有用。
user1277476 answered 2020-06-18T09:08:05Z
4 votes
请记住,crontab是守护程序或服务,因此它不像用户登录之类的东西。 如果要使用环境变量,则需要自己进行设置。 但是,大多数这些变量是由外壳程序在/ etc / profile路径中设置的,然后进入自定义变量进入$ HOME目录。
您可以通过“采购”您的/ etc / profile来设置其中一些设置,例如:cron_env.sh41 11 * * * /home//cron_env.sh其中cron_env.sh将包含以下内容:#!/bin/sh
source /etc/profile
/usr/bin/env > /home//cron_env.log
Freddy answered 2020-06-18T09:08:35Z
3 votes
在我们的环境中,我们通常不会遇到此问题,因为root是唯一允许的cron,并且每个命令通常都是通过su -c命令以应用程序特定用户身份通过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
Alan Kwiatkowski answered 2020-06-18T09:09:00Z
1 votes
crontab不是bash脚本,您不能使用Shell中通常可用的环境变量。
尝试将所有代码移入一个由shebang编辑的脚本文件(以“#!/ bin / bash”行开头的文件),然后在crontab中运行该脚本。
我不确定,但是我认为PATH(如果您设置了EMAIL,则可能是EMAIL)可能是您可以在crontab文件中访问的唯一路径。
编辑:检查crontab 5手册页,有很多可用的环境变量,全部由cron守护程序设置。
KurzedMetal answered 2020-06-18T09:09:33Z