首先,对不起我的英语。
我的情况是:
- 有一个 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/环境
- 在 /etc/profile.d 中创建myvars.sh文件
问题是当我为我的用户配置变量(例如在 ~/.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
用于定义环境变量但没有此文件的内容。谢谢
cron
在自己的最小环境中运行作业,并且本身不会读取任何 shell 启动文件,例如那些在/etc/profile.d/
- 默认情况下,它就像你有几个选择:
在脚本中设置变量,然后从
cron
. 对于 shell 脚本,这很容易(只需将它们导出到脚本顶部 - 或者如果您愿意,可以获取环境文件)。对于 Python 脚本,您可能会发现将python
调用包装在 shell 脚本中最简单,您可以先在其中设置环境。name = value
将环境定义为crontab中的一系列对,例如=
(因为它不是脚本,所以周围允许有空格);但是请注意,此方法不会扩展变量,因此您不能执行类似的操作PATH=$PATH:/whatever
详情请参阅
man 5 crontab
。由于我不想用英语以外的语言和评论中的建议打扰任何人,因此我将尝试制作两个版本的答案,一个是英语版本,另一个是西班牙语版本。西班牙语,因为我认为(在我看来是正确的)是提问者的母语,我想以流利的方式为他解释。
您可以在脚本中定义 PATH 变量,并将它们导出到那里。通常,cronjobs 在一个 PATH 很小的 shell 中运行。在您的脚本中定义 PATH 变量并添加在终端中执行时显示的内容
echo $PATH
或者你可以做的是,如果你已经在 ~ /.bashrc 中有必要的配置,在你的 bash 脚本中使用 source /home/your_user/.bashrc
在您将运行的脚本中定义 PATH 变量之后,定义您在解释中放入的变量,也就是说,您应该有如下内容:
.bashrc 和 .bash_profile 等文件是在您启动终端时读取的文件,但在 cronjob 的情况下,这些文件不会被读取(除非您通过源 /home/your_user/.bashrc 允许它)。这些文件的目的是,在进入 bash 之前,您已将配置设置为环境变量、别名等。在 cronjob 中运行的脚本中,您可以执行相同操作,手动声明变量或使用“源”加载它们"
现在用西班牙语。
No sé si te entendí bien pero, por lo que entendí, tienes un problema en el cual puedes ejecutar un script desde tu terminal, pero cuando tratas de ejecutarlo en un cronjob, te lanza el error descrito。
Puedes definir la variable PATH dentro de tu script, y exportarlas ahí mismo。Por lo general los cronjobs se ejecutan en una shell con unambiente muy reducido。Dentro de tu script define la variable PATH y agrégale lo que se muestra al ejecutar en la terminal
echo $PATH
O algo que puedes hacer es, si ya tienes la configuración necesaria en tu ~/.bashrc, dentro de tu script de bash usa
source /home/tu_usuario/.bashrc
Y después de definir tu variable PATH en tu script que correras, define las variables que pusiste en tu caso, es decir, te tendria que quedar algo así
Los archivos como .bashrc y .bash_profile, son archivos que se leen cuando inicias una terminal, pero en el caso de un cronjob, estos no se leen (a menos que lo permitas con el source /home/tu_usuario/.bashrc)。El fin de estos archivos es que、antes de estar dentro de una terminal、tengas las configuraciones establecidas como variables de entorno、alias 等。 En un script que se corre dentro de un cronjob puedes hacer lo mismo, declarar las variables a mano o cargarlas con“来源”。