Lorsque cron
exécute un événement, il utilise l'environnement shell par défaut de l'UID en cours d'exécution. Cependant, aucune personnalisation de "profil" n'est appliquée, c'est-à-dire que votre .bash_profile
n'a pas de source et les paramètres PATH ne sont donc pas pris en compte. De même, je ne pense pas que les profils communs soient récupérés. En conséquence, vous n'avez probablement pas de PATH
o LD_LIBRARY_PATH
des paramètres d'environnement disponibles pour le processus que vous essayez de lancer et c'est pourquoi pdfimages
y gs
n'est pas récupéré par défaut.
Dans le passé, j'ai résolu ce problème de deux façons :
- Référencer directement le chemin complet du fichier dont j'ai besoin.
- Créer un shell wrapper script pour le travail.
Je préfère généralement la deuxième solution, car elle me permet non seulement de configurer un environnement pour l'exécution de la tâche, mais aussi d'ajouter facilement des situations de débogage. Par exemple, si le job ne fonctionne pas correctement, je peux simplement éditer le shell script et y mettre STDOUT
redirection vers un fichier de débogage.
Donc, en résumé, j'aurais une entrée cron de
* 6 * * * cd /path/to/ && ./executable.sh
.. qui changerait en chemin d'accès, mais l'option executable.sh
ferait tout le export PATH
, export LD_LIBRARY_PATH
etc. pour mettre en place mon travail.
Votre échantillon executable.sh
pourrait être aussi simple que ça :
#!/bin/bash
# if you want to just pick up your profile, you can '.' source it
. ~/.bash_profile
export PATH=/where/i/find/gs
export LD_LIBRARY_PATH=/if/i/need/libs
(./executable 2&>1) >executable.out
Le site executable.out
la redirection des fichiers n'est pas nécessaire puisque sans elle, tous les STDOUT
va à cron.out
mais c'est un peu plus propre de le faire de cette façon. De même, le 2>&1
Le non-sens de la parenthèse permet de s'assurer que les deux STDERR
y STDOUT
dans le fichier de sortie ; cela permet de déboguer les raisons pour lesquelles un travail n'a pas été exécuté.
3 votes
Ajouter le chemin d'accès complet à
pdfimages
etgs
dans votre script.0 votes
Je n'appelle pas pdfimages et gs directement dans mon script, ils sont tous deux utilisés par pypdfocr, donc je ne peux pas ajouter le chemin complet dans mon script.