7 votes

cron et "commande non trouvée"

Je suis en train de mettre en place une tâche cron pour exécuter un exécutable bash script qui contient une commande pypdfocr. Chaque fois que j'exécute manuellement le script tout fonctionne comme prévu, si à la place j'utilise cron avec cette planification :

* 6 * * * cd /path/to/ && ./executable

Je reçois cette erreur :

pypdfocr: command not found

Compte tenu de cela, dans le bash script j'ai essayé de donner le chemin complet de pypdfocr, c'est-à-dire :

/anaconda/bin/pypdfocr

Mais maintenant, c'est fait :

/bin/sh: pdfimages: command not found
/bin/sh: gs: command not found

Une idée sur la façon dont je peux réparer cela ?

3 votes

Ajouter le chemin d'accès complet à pdfimages et gs 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.

9voto

Jenea Points 2702

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 :

  1. Référencer directement le chemin complet du fichier dont j'ai besoin.
  2. 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é.

1 votes

cron crée son propre environnement. En particulier, SHELL est défini comme /bin/sh et PATH est réglé sur /usr/bin:/bin . L'environnement peut être personnalisé dans le crontab . Lire la suite dans man 5 crontab .

0 votes

@fd0 : la définition de variables d'environnement dans la crontab n'est pas universelle dans toutes les implémentations ; je ne suis pas sûr que darwin/osx/MacOS le fasse ? Quoi qu'il en soit, ces paramètres seraient appliqués à toutes les entrées de cron, ce qui peut ou non être souhaitable. En tant que tel, je suggérerais probablement toujours que cron exécute un script de toute façon puisque vous avez au moins un contrôle individuel de la tâche.

0voto

SergeGardien Points 41

Finalement, j'ai suivi la solution proposée à l'adresse suivante Comment utiliser macports Python dans une tâche cron ? .

J'ai vérifié mon PATH d'environnement en exécutant env depuis le Terminal, puis je l'ai exporté dans mon exécutable.

exécutable :

#!/bin/bash
export PATH=/Library/Frameworks/Mono.framework/Versions/Current/bin/:/opt/local/bin:/opt/local/sbin://anaconda/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/local/bin:/opt/local/sbin:/Library/Frameworks/Python.framework/Versions/2.6/bin:/sw/bin:/sw/sbin:/usr/bin:/bin:/usr/local/bin:/opt/X11/bin:/Users/USER/Library/Android/sdk/platform-tools/:/Users/USER/Library/Android/sdk/tools/:/usr/sbin/:/Users/USER/Tools/cpdf/OSX-Intel/
# ...
# REST OF SCRIPT
# ...

Après cela, j'ai modifié mon cronfile avec ce qui suit :

* * * * * /path/to/executable

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X