linux crontab需要指定目录,linux-crontab路径和用户

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值