从 cronjob 运行 bash 脚本失败并显示“没有这样的文件或目录”

Car*_*izz 1 python bash shell cron anaconda

我正在尝试运行以下 bash 脚本,该脚本在激活 conda 环境后运行 Python 程序。

发送.bash

#!/bin/bash
source activate manage_oam_users
python ~/path/to/script/send.py
source deactivate
Run Code Online (Sandbox Code Playgroud)

定时任务表

30 * * * * source /path/to/script/send.bash
Run Code Online (Sandbox Code Playgroud)

尽管运行source send.bash正常,但我从 cron 收到以下错误。我也试过使用bash send.bashwhich 在手动运行时工作正常,但从 cron 运行时会导致相同的错误。

#!/bin/bash
source activate manage_oam_users
python ~/path/to/script/send.py
source deactivate
Run Code Online (Sandbox Code Playgroud)

Neo*_*nit 5

activate并且deactivate可能是位于$PATH变量中某个条目指向的某个位置的脚本。通常,为一个用户本地安装的软件会向您的.profile文件添加语句或.bashrc扩展您的$PATH变量,以便您可以在不使用完整路径的情况下使用该软件的脚本。

当你的bash的负载.profile.bashrc自动,cron将会那样做。至少有两种解决方案

A) 无处不在的完整路径

您可以在 CRON 作业执行的脚本中使用完整路径,如下所示:

#!/bin/bash
source /path/to/activate manage_oam_users
python $HOME/path/to/script/send.py
source /path/to/deactivate
Run Code Online (Sandbox Code Playgroud)

也使用$HOME代替~. 您可以在 shell 中使用which activate和找出完整路径which deactivate

B) 来源.profile.bashrc

或者,您可以在 CRON 选项卡中获取.profile(或.bashrc;您必须查看哪个文件$PATH使用 anaconda 目录扩展了您的变量):

30 * * * * source $HOME/.profile; source /path/to/script/send.bash
Run Code Online (Sandbox Code Playgroud)

补充:来源是什么意思?

source是一个 Unix 命令,它评估命令后面的文件,作为在当前上下文中执行的命令列表。

来自维基百科,伟大的百科全书

source命令的常用别名是单点 ( . /path/to/script)。

可以在 UNIX 和 Linux Stack Exchange 上找到相关但更通用的问题。