Comment puis-je exécuter une commande cron avec des variables d'environnement existantes?
Si je suis à l'invite du shell, je peux taper echo $ORACLE_HOME
et obtenir un chemin. C’est l’une de mes variables environnementales qui est définie dans mes ~/.profile
. Cependant, il semble que les ~/.profile
scripts ne soient pas chargés et, par conséquent, mes scripts échouent car la $ORACLE_HOME
variable n'est pas définie.
Dans cette question, l'auteur mentionne la création d'un ~/.cronfile
profil définissant des variables pour cron, puis il effectue une solution de contournement pour charger toutes ses commandes cron dans des scripts qu'il conserve dans son ~/Cron
répertoire. Un fichier ~/.cronfile
ressemble à une bonne idée, mais le reste de la réponse semble un peu lourd et j'espérais que quelqu'un pourrait me dire un moyen plus facile d'obtenir le même résultat.
Je suppose qu'au début de mes scripts, je pourrais ajouter quelque chose du genre source ~/.profile
mais cela semble être redondant.
Alors, comment puis-je faire en sorte que mes scripts cron chargent les variables à partir de mon profil de shell interactif?
source ~/.profile
à un programme est-il redondant? Les programmes héritent de leur environnement du programme appelant. Si ce programme d’appel n’est pas votre shell, comment le programme en question obtiendra-t-il l’environnement souhaité?su -l
pour configurer un environnement de connexion normal comprenant le $ PATH pour un utilisateur root ou autre.Réponses:
Dans la crontab, avant de commander, ajoutez
. $HOME/.profile
. Par exemple:Cron
ne sait rien de votre coquille; il est démarré par le système, il a donc un environnement minimal. Si vous voulez quelque chose, vous devez l'avoir vous-même.la source
.
avant le script? (Je ne sais pas comment je le feraisman
). Pourquoi est-ce différent desource
?.
commande est la commande d'origine poursource
. Ils sont équivalents dans le shell et un peu plus faciles à taper, surtout dans une crontab. Pour obtenir plus d'informations, tapezhelp .
ou recherchez^SHELL BUILTIN COMMANDS
dans la page de manuelbash
ou en haut deman
zshbuiltins,. Running
tapez .` vous dira que la commande est une commande intégrée..profile
par.bash_profile
. Vérifiez quel.profile
fichier existe dans le répertoire de base de l'utilisateur.Une autre option, que je trouve plus facile, consiste à exécuter le script avec cron et à inclure l’environnement dans le script.
Dans le fichier crontab -e:
Dans le fichier cron_job.sh:
Toute commande après la source de .bash_profile aura votre environnement comme si vous vous étiez connecté.
la source
/bin/bash
comme shell. Je n'arrêtais pas de me demander pourquoi des choses comme, par exemplecd /path/to/project; source .vars
, fonctionneraient lorsque je les taperais manuellement mais échoueraient (File not found
) si elles étaient incluses dans un travail cron. La ligne de touche pour moi était de réglerSHELL=/bin/bash
afin que je puisse réellement utiliser des commandes bash familières dans chaque travail cron./bin/sh/
(le shell par défaut, apparemment) est très limitant.EnvironmentFile
unité de service. Dommage que cron n'ait pas quelque chose de similaire.$SHELL
c'est le cas/bin/sh
, lasource
commande n'existe pas. Utilisez à la.
place.Une autre option, que je trouve plus facile, est d’exécuter le script avec cron et d'indiquer à bash de se connecter (d'où l'utilisation de
/etc/profile.d/...
définitions d'environnement).En
crontab -e
fichier:Toute commande après la source de
.bash_profile
aura votre environnement comme si vous vous êtes connecté.la source
Mauvaise idée. La pratique générale consiste à définir spécifiquement toutes les variables d'environnement requises dans un script à exécuter à partir d'un travail cron.
la source
/usr/bin/env
commande pour définir les variables, puis agir en tant que processus d’environnement pour le travail cron.envdir
vient aussi à l'esprit.~/.cronvars
et l'inclure dans le profil ainsi que dans mes scripts cron. Je ne souhaite pas coder de manière stricte les variables d'environnement dans chacun des scripts que j'exécute car, lorsque des chemins changent, les chemins codés en dur dans chaque fichier ne sont pas faciles à gérer. On dirait que cela permettrait un emplacement centralisé pour les variables nécessaires tout en empêchant le chargement d'autres variables.Cette syntaxe vous aide vraiment. Je ne comprends pas la syntaxe, mais ça marche. Oracle utilise cette syntaxe lors du déploiement d'Oracle Configuration Manager sur crontab. Par conséquent, j'estime qu'il s'agit d'une bonne solution.
la source
Je suis récemment tombé sur un cas dans lequel je devais exécuter le travail global de cron en tant que root tout en exécutant une sous-commande en tant qu'utilisateur différent (ce qui nécessitait de rechercher l'environnement de cet utilisateur). Je suis allé avec l'approche suivante:
La partie cruciale est l'argument
-i
qui est passé etsudo
qui exécutera la commande donnée dans un shell de connexion séparé (ce qui signifie que les fichiers de points de l'utilisateur seront générés).PS: Notez que la
user
colonne est uniquement disponible dans/etc/crontab
et les/etc/cron.d/*
fichiers.la source
La solution qui a fonctionné pour moi est décrite ici .
Vous créez un script wrapper qui appelle
. ~/.cronfile
puis fait les choses que vous voulez. Ce script est lancé par cron.Dans
~/.cronfile
vous spécifiez l'environnement pour vos tâches cron.la source
Oui, vous pouvez utiliser des "solutions de contournement bien connues" (dont certaines ont été répertoriées). C’est une autre façon de dire que tout le monde sait que c’est de la merde, bien que certaines personnes qualifient cela de "dispositif de sécurité" le temps perdu n'était pas pour rien. C'est l'équivalent cron du clavier QWERTY.
Je soupçonne que la raison initiale était peut-être liée aux performances, de telle sorte que les scripts exécutés une fois par minute ne prennent pas le temps de lire des scripts rc. De plus, à l'origine, cron n'était pas vraiment configurable, donc un paramètre par défaut était vraiment la seule option.
Il n’ya pas de sécurité supplémentaire en n’ayant pas une configuration ou une méthode simple permettant à cron de s’occuper uniquement de l’environnement de votre shell interactif au lieu d’obliger les utilisateurs à effectuer une gymnastique de shell stupide. Sur une machine moderne, les gains de performance ne sont généralement pas perceptibles, sauf si vous avez une grande quantité de travaux en cours d'exécution à la minute.
La culture Unix échoue. À mon humble avis. :-)
la source
Ajouter
à la crontab. Voir Comment garantir la disponibilité de $ BASH_ENV
la source
Au lieu de définir le profil, ce qui m’a aidé a été de définir le
PATH
. Certaines des commandes n'étaient pas disponibles dans mes scripts cron, car ellesPATH
sont différentes.Définir
PATH
avec le chemin des commandes m'a aidé. Encore mieux si vous pouvez utiliser un modèle et désemployer plus tard,Passer des variables à chaque élément semble compliqué.
la source
Je mets .
~/.dbus/session-bus/*
au sommet de mon script désiré :)la source