web-dev-qa-db-fra.com

Définir la variable d'environnement UBUNTU 18.04 (bionique) - Crontab

Tout d'abord, désolé pour mon anglais.

Ma situation est:

  • Avoir un Ubuntu 18.04
  • Voulez-vous exécuter avec les scripts crontab python & sh
  • Résultat: / usr/lib/Oracle/12.2/client64/bin/sqlplus: erreur lors du chargement des bibliothèques partagées: libsqlplus.so: impossible d'ouvrir le fichier de l'objet partagé: aucun fichier ou répertoire de ce type

Les variables que je veux ajouter sont définies comme suit:

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

Je configure la variable d'environnement de plusieurs manières pour éviter cette erreur:

  • ~/.bashrc
  • ~/.profile
  • / etc/environment
  • Création du fichier myvars.sh dans /etc/profile.d

Le problème, c’est que lorsque je configure les variables pour mon utilisateur (dans ~/.profile, par exemple) et que j’exécute sur le terminal un script python ou sh utilisant une connexion SQL se termine bien et ne donne pas toute erreur. Mais lorsque le python est exécuté via crontab, l'erreur apparaît dans le journal:

/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

j'ai lu dans d'autres discussions de forum que ~./bash_profile est utilisé pour définir des variables d'environnement, mais que ce fichier n'existe pas. Merci

cronexécute des travaux dans son propre environnement minimal et ne lit pas lui-même les fichiers de démarrage de Shell tels que ceux de /etc/profile.d/. Par défaut, il s'agit simplement de quelque chose comme:

LANGUAGE=en_CA:en
HOME=/home/steeldriver
LOGNAME=steeldriver
PATH=/usr/bin:/bin
LANG=en_CA.UTF-8
Shell=/bin/sh
PWD=/home/steeldriver

Vous avez plusieurs options:

  1. définissez les variables dans un script et exécutez that à partir de cronname__. Dans le cas des scripts Shell, c'est simple (exportez-les simplement en haut du script ou sourcez un fichier d'environnement si vous préférez). Pour les scripts Python, vous trouverez peut-être plus simple de placer l'appel pythondans un script Shell dans lequel vous pouvez configurer l'environnement en premier.

  2. définir l'environnement comme une séquence de name = value paires à l'intérieur de la crontab comme

    Oracle_HOME = /usr/lib/Oracle/12.2/client64
    * 5 * * * /path/to/some/executable
    

    (les espaces sont autorisés autour du = puisqu'il ne s'agit pas d'un script); Cependant, notez que cette méthode ne développe pas les variables, vous ne pouvez donc pas faire des choses comme PATH=$PATH:/whatever

Voir man 5 crontab pour plus de détails.

1
steeldriver

Puisque je ne veux déranger personne avec une langue autre que l'anglais et par suggestion dans les commentaires, je vais essayer de faire deux versions de la réponse, une en anglais et une autre en espagnol. L’espagnol depuis que j’assume (et il me semble que c’est correct) est la langue maternelle de l’interrogateur et je souhaite lui expliquer de manière parlante.

Vous pouvez définir la variable PATH dans votre script et les exporter à cet endroit. En général, les tâches cron fonctionnent dans un shell avec un très petit PATH. Dans votre script, définissez la variable PATH et ajoutez ce qui est affiché lors de l'exécution dans le terminal echo $PATH

Si vous avez déjà la configuration nécessaire dans votre ~ /.bashrc, dans votre script bash, utilisez source /home/votre_utilisateur/.bashrc.

Et après avoir défini votre variable PATH dans votre script que vous allez exécuter, définissez les variables que vous avez insérées dans votre explication, c'est-à-dire que vous devriez avoir quelque chose comme ceci:

#!/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

Des fichiers tels que .bashrc et .bash_profile sont des fichiers qui sont lus lorsque vous démarrez un terminal, mais dans le cas d'un travail cronjob, ils ne sont pas lus (à moins que vous ne l'autorisiez avec le source /home/votre_utilisateur/.bashrc). Le but de ces fichiers est que, avant d’être dans bash, vous avez les configurations définies en tant que variables d’environnement, alias, etc. Dans un script exécuté dans un travail cron, vous pouvez faire de même, déclarer les variables manuellement ou les charger avec "source "

Maintenant en espagnol.

Pas de problème si vous ne dites pas, que ce soit un problème ou un problème, mais que vous écrivez un script de terminal, que ce soit un mot de passe, que ce soit une erreur ou une erreur.

Puedes definir la variable PATH écriture, écriture et exportation. En gros, les tâches sont exécutées dans une coquille avec une réduction de poids. Dentro de tu script définit la variable PATH et l’agrégale qui doit être exécutée à la fin du code echo $PATH

Nous avons besoin de la configuration de votre ordinateur ~/.bashrc, de votre script de bash usa source /home/tu_usuario/.bashrc

Vous avez défini votre variable PATH en script qui corrige, définissez les variables que vous cassez en cas de non-respect, la valeur qui vous convient le mieux.

#!/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, fils archivés que l'on commence à jouer dans un terminal, dans lesquels on ouvre une session, ou qui se trouvent à la source ou dans la source/home/tu_usuario/.bashrc). Les éléments finaux archivés, les éléments inconnus, les paramètres définis, les variables telles que définies, etc., ainsi que les autres paramètres définis précédemment, etc. cargarlas con "source".

0
Marco