首先,抱歉,我的英语不好。
我的情况是:
- 拥有 Ubuntu 18.04
- 想要用 crontab 执行 python 和 sh 脚本
- 结果:/usr/lib/oracle/12.2/client64/bin/sqlplus:加载共享库时出错:libsqlplus.so:无法打开共享对象文件:没有此文件或目录
我想要添加的变量定义如下:
export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export PATH=$PATH:$ORACLE_HOME/bin
export OCI_LIB_DIR=$ORACLE_HOME/lib
export OCI_INC_DIR=/usr/include/oracle/12.2/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME
我通过多种方式配置环境变量来避免这个错误:
- ~/.bashrc
- 〜/ .profile
- /etc/环境
- 创建myvars.sh/etc/profile.d 中的文件
问题是,当我为我的用户配置变量(例如在 ~/.profile 中)并在终端上执行一个使用 SQL 连接的 python 或 sh 脚本时,运行正常,没有出现任何错误。但是当通过 crontab 执行 python 时,日志中会出现错误:
/usr/lib/oracle/12.2/client64/bin/sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory
我在其他论坛帖子中看到过~./bash_profile
用于定义环境变量的文件,但没有这个文件。谢谢
答案1
cron
在自己的最小环境中运行作业,本身不会读取任何 shell 启动文件,例如/etc/profile.d/
默认情况下它只是类似
LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
SHELL=/bin/sh
PWD=/home/steeldriver
您有以下几种选择:
在脚本中设置变量并运行那从 开始
cron
。对于 shell 脚本,这很容易(只需在脚本顶部导出它们 - 或者如果您愿意,可以获取环境文件)。对于 Python 脚本,您可能会发现最简单的方法是将调用包装python
在 shell 脚本中,您可以在其中先设置环境。name = value
将环境定义为crontab 中的一系列对,例如ORACLE_HOME = /usr/lib/oracle/12.2/client64 * 5 * * * /path/to/some/executable
(由于它不是脚本,所以允许在 周围使用空格
=
);但请注意,此方法不会扩展变量,因此您不能执行类似以下操作PATH=$PATH:/whatever
请man 5 crontab
参阅详情。
答案2
您可以在脚本内定义 PATH 变量,并将其导出到那里。
一般来说,cronjobs 在 shell 中运行,PATH 中只有很少的文件夹。
在脚本中定义 PATH 变量并添加在终端执行时显示的内容echo $PATH
。
您还可以获取您的/home/your_user/.bashrc
。
在脚本中定义 PATH 变量后,还要定义在解释中放入的变量,也就是说,您应该有如下内容:
#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export PATH=$PATH:$ORACLE_HOME/bin
export OCI_LIB_DIR=$ORACLE_HOME/lib
OCI_INC_DIR=/usr/include/oracle/12.2/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME
python your_program.py
.bashrc
和之类的文件.bash_profile
是在您启动终端时读取的文件,但在 cronjob 的情况下,不会读取这些文件(除非您使用源 /home/your_user/.bashrc 允许它)。
这些文件的目的是,在进入 bash 之前,您将配置设置为环境变量、别名等。在 cronjob 中运行的脚本中,您可以执行相同的操作,手动声明变量或使用“source”加载它们。