crontab 路径和用户

2024-10-24 08:51:00
admin
原创
244
摘要:问题描述:我是使用 cron 和 crontab 安排任务的新手。我试图安排任务的执行,就像我登录、打开终端并亲自执行任务一样。但是,我安排了一项任务来帮助我观察计划任务正在执行的 $USER 和 $PATH,这是我发现的:$ crontab -l 41 11 * * * echo "USE...

问题描述:

我是使用 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 守护进程设置。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2593  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1555  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   32  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   28  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   24  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用