如何让CRON调用正确的路径

2024-05-16 07:43:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着让克朗按正确的路径打电话。当我从shell运行Python脚本时,脚本运行良好,因为它使用了bashrc中设置的路径,但是当我使用cron时,所有的路径都不是从bashrc使用的。有没有一个文件可以输入cron的路径,比如bashrc,或者从bashrc调用路径?

很抱歉,我认为我的措辞不正确,我可以运行正确的脚本(这意味着crontab中脚本的路径不是这里的问题),就在该脚本运行时,我运行了一个构建,它使用了.bashrc中设置的路径。当我在登录时运行脚本时,会拉入.bashrc路径。因为cron不在shell中运行,所以它不会拉入.bashrc。有没有一种方法可以在不必编写bash脚本包装器的情况下引入它?


Tags: 文件方法路径脚本bash情况shellcron
3条回答

您应该在crontab中放置完整路径。这是最安全的选择。
如果不想这样做,可以在程序周围放置一个包装脚本,并在其中设置路径。

例如

01 01 * * * command

变成:

01 01 * * * /full/path/to/command

同样,从cron调用的任何东西都应该非常小心它运行的程序,并可能为PATH变量设置自己的选择。

编辑:

如果您不知道命令在哪里,您希望从shell执行which <command>,它会告诉您路径。

编辑2:

因此,一旦程序运行,它应该做的第一件事就是将PATH和任何其他必需的变量(例如LD_LIBRARY_PATH)设置为脚本运行所需的值。
基本上,不要考虑如何修改cron环境以使其更适合您的程序/脚本-通过在脚本启动时设置适当的cron环境,使脚本处理给定的环境。

我用了/etc/crontab。我使用了vi,并在需要的路径中输入到这个文件中,并以根用户身份运行它。普通crontab会覆盖您设置的路径。A good tutorial on how to do this

系统范围cron文件如下所示:

This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, 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 user   command
42 6 * * *   root    run-parts --report /etc/cron.daily
47 6 * * 7   root    run-parts --report /etc/cron.weekly
52 6 1 * *   root    run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py

很可能,cron是在一个非常稀疏的环境中运行的。检查cron正在使用的环境变量,方法是附加一个虚拟作业,该作业将env转储到如下文件:

* * * * * env > env_dump.txt

将其与正常shell会话中的env输出进行比较。

通过在crontab的顶部定义环境变量,可以将自己的环境变量前置到本地crontab。

下面是一个快速修复程序,用于将$PATH前置到当前crontab:

# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron

生成的crontab看起来与chrissygormley的答案类似,路径在crontab规则之前定义。

相关问题 更多 >