Tout d'abord, désolé pour mon anglais.
Ma situation est:
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:
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
cron
exé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:
définissez les variables dans un script et exécutez that à partir de cron
name__. 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 python
dans un script Shell dans lequel vous pouvez configurer l'environnement en premier.
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.
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 "
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".