设置环境变量 UBUNTU 18.04 (bionic) - Crontab

设置环境变量 UBUNTU 18.04 (bionic) - Crontab

首先,抱歉,我的英语不好。

我的情况是:

  • 拥有 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

您有以下几种选择:

  1. 在脚本中设置变量并运行从 开始cron。对于 shell 脚本,这很容易(只需在脚本顶部导出它们 - 或者如果您愿意,可以获取环境文件)。对于 Python 脚本,您可能会发现最简单的方法是将调用包装python在 shell 脚本中,您可以在其中先设置环境。

  2. 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”加载它们。

相关内容