AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1059380
Accepted
Juan Carlos Arqueros Vírseda
Juan Carlos Arqueros Vírseda
Asked: 2018-07-26 05:49:58 +0800 CST2018-07-26 05:49:58 +0800 CST 2018-07-26 05:49:58 +0800 CST

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

  • 772

首先,对不起我的英语。

我的情况是:

  • 有一个 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用于定义环境变量但没有此文件的内容。谢谢

bash environment-variables cron sql
  • 2 2 个回答
  • 22188 Views

2 个回答

  • Voted
  1. Best Answer
    steeldriver
    2018-07-26T06:09:47+08:002018-07-26T06:09:47+08:00

    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。

    • 3
  2. Cuauhtli
    2018-07-26T06:16:31+08:002018-07-26T06:16:31+08:00

    由于我不想用英语以外的语言和评论中的建议打扰任何人,因此我将尝试制作两个版本的答案,一个是英语版本,另一个是西班牙语版本。西班牙语,因为我认为(在我看来是正确的)是提问者的母语,我想以流利的方式为他解释。

    您可以在脚本中定义 PATH 变量,并将它们导出到那里。通常,cronjobs 在一个 PATH 很小的 shell 中运行。在您的脚本中定义 PATH 变量并添加在终端中执行时显示的内容echo $PATH

    或者你可以做的是,如果你已经在 ~ /.bashrc 中有必要的配置,在你的 bash 脚本中使用 source /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 中运行的脚本中,您可以执行相同操作,手动声明变量或使用“源”加载它们"

    现在用西班牙语。

    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 terminalecho $PATH

    O algo que puedes hacer es, si ya tienes la configuración necesaria en tu ~/.bashrc, dentro de tu script de bash usasource /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í

    #!/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 tu_programa.py
    

    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“来源”。

    • 0

相关问题

  • 如何每 5 秒运行一次脚本?

  • 如何使 cron 电子邮件成为我的 @gmail 帐户

  • 如何设置环境变量?

  • 备份 bash 脚本未压缩其 tarball

  • 在哪里可以找到有关 /etc/environment 文件格式的文档?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve