crontab 路径和用户
- 2024-10-24 08:51:00
- admin 原创
- 61
问题描述:
我是使用 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 任务按我想要的方式运行?
解决方案 1:
根据“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 或任何环境变量。但这个例子对于典型情况来说似乎已经足够了。
解决方案 2:
在 *ix 中,进程通常通过 fork+exec 从其父进程继承环境。它们可以选择清除环境,但通常不会这样做。您可以使用 ps axf 查看进程树,也可以使用 ps axfe 查看环境变量。
cron 通常不是某个 shell 的子进程,因此它通常具有与交互式 shell 不同的环境。不过,cron 很有可能会以某种方式故意清除自己的环境以保持一致性。
我喜欢在交互式 shell 中使用以下命令测试我的 cron 作业(为了便于讨论,这里用“foo”表示):env - ./foo 这实际上会清除 cron 所做的更多环境变量,但在我看来,这更容易让事情顺利进行,因为您测试的内容更相似。您需要设置您依赖的任何变量(如 $PATH),或将其替换为其他变量 - 例如 $USER 变为 $(whoami)。
我还喜欢在编写 bash 脚本时使用“set -eu”和“set -o pipefail”。-eu 表示“在非零退出代码时退出,在未定义变量引用时退出”,pipefail 表示“不返回管道中的最后一个退出代码,而是返回管道中第一个非零的退出代码”。对于您的情况,set -u 可能特别有用。
解决方案 3:
在我们的环境中,我们通常不会遇到此问题,因为 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
解决方案 4:
请记住,crontab 是一个守护进程或服务,因此它不像用户登录之类的东西。如果您想要拥有环境变量,则需要自己设置它们。但是,大多数这些变量都是由 shell 从 /etc/profile 路径设置的,然后进入您的自定义变量,再进入您的 $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
解决方案 5:
crontab 不是 bash 脚本,您不能使用 shell 中通常可用的环境变量。
尝试将所有代码移动到 shebang 脚本文件(以“#!/bin/bash”开头的文件)并在 crontab 中运行该脚本。
我不确定,但我认为 PATH(如果您设置了 EMAIL,也可能是 EMAIL)可能是您在 crontab 文件中唯一可以访问的。
编辑:检查crontab 5 手册页,有相当多的环境变量可用,全部由 cron 守护进程设置。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件