crontab 路径和用户

2024-10-24 08:51:00
admin
原创
61
摘要:问题描述:我是使用 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 守护进程设置。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用