J'ai défini la variable "SHELL" dans le fichier / etc / crontab:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
De plus, tous mes scripts dans le fichier / etc / crontab sont démarrés sous l'utilisateur "martin". Cependant, /home/martin/.bash_profile (pour le shell de connexion) et /home/martin/.bashrc (pour le shell qui ne se connecte pas) contiennent des variables qui sont ignorées dans le cas d'un travail cron, mais sont utilisées dans le cas où je me connecte à la machine SSH ou ouvrir une nouvelle session bash. Pourquoi cron ignore ces variables? Cron n’exécute-t-il pas simplement "/ usr / local / bin / bash mon-script.sh" avec les autorisations pour l'utilisateur "martin"?
.bashrc
a une ligne qui l'empêche de courir dans des coquilles non interactives.Réponses:
Vous pouvez rechercher le fichier souhaité en haut du script ou au début du travail pour l'utilisateur qui l'exécute. La commande "source" est une commande intégrée. Vous feriez la même chose si vous apportiez des modifications à ces fichiers pour charger les modifications.
ou
la source
bash
shell. J'ai ajouté une réponse qui peut gérer le cas lorsque le shell estsh
.Parce que ce n'est pas un shell interactif. La même chose se produit lorsque vous ouvrez certains terminaux.
Jetez un oeil à cette question: Qu'est-ce que le fichier .bashrc? | Super utilisateur
Et aussi à celui-ci:
Quelle est la différence entre .bashrc, .bash_profile et .environment? | Débordement de pile
Différents scripts se déclenchent selon que la connexion est un shell de connexion (ou non), un shell interactif (ou non) ou les deux.
Si vous voulez faire bashrc vous aurez besoin de faire ce changement:
Source: Fichiers de démarrage Bash | Manuel de référence Bash | gnu.org
la source
Vous ne pourrez peut-être pas vous lancer
source
si lesh
shell est utilisé. Cela peut être changé en ajoutant la ligne suivante dans votre crontab:Vous pouvez également spécifier l'environnement:
ou vous pouvez utiliser votre section locale
/home/user/.bashrc
s'il s'agit d'un travail utilisateur (par exemplecrontab -e
).Notez que cela
.bash_profile
peut remplacer.bashrc
, s'il existe.Crédit: Comment changer de shell cron (sh en bash)?
la source
SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
Les
.bashrc
vérifications effectuées par ce fichier pour détecter les shells interactifs peuvent également interférer avec le sourcing de votre travail cron.Par exemple, sur Ubuntu 18.04, la valeur
.bashrc
par défaut pour un utilisateur commence par ceci:et si le sourcing ne fera rien d’utile car il sortira immédiatement.
la source
Vous pouvez appeler bash avec l'
-l
option, comme ceci:L'
-l
option fait bash un shell de connexion . Ainsi, il lira l'utilisateur.bash_profile
. Il ne lira l'utilisateur.bashrc
que s'il est explicitement recherché par.bash_profile
. En effet, les shells non interactifs ne lisent pas automatiquement.bashrc
. Mais vous ne devriez pas avoir besoin.bashrc
d’un travail cron car.bashrc
c’est utile pour configurer des choses utiles pour un shell interactif .Variations:
Si bash est sur le PATH, il n'est pas nécessaire de spécifier un chemin absolu:
Une optimisation consisterait à remplacer le shell actuel en utilisant
exec
:la source
bash
agit différemment, que ce soit un shell ou un langage de programmation normal (commeperl
oupython
).De par sa conception, les paramètres
~/.bash_profile
,~/.bashrc
etc. sont pour les utilisateurs à des choses ensemble quandbash
joue le rôle d'un shell (shell de connexion, shell interractive). Pensez à l'environnement que vous avez dans unxterm
(shell interactif) ou dans desssh
sessions (shell de connexion) ou dans des consoles (shell de connexion).D'autre part, il
bash
s'agit également d'un puissant langage de programmation ( pensez à de nombreux scripts pour la gestion de services danssystemd
) qui nécessite un style de travail différent. Par exemple, lorsqu'un développeur est en train d'écrire un script système ou unbash
programme, il / elle ne voudra pas rechercher~/.bash_profile
automatiquement le nom de l'utilisateur . C'est un programme normal, pas un shell. Un programme normal (y compris lesbash
programmes) hériterait naturellement des paramètres de l'environnement de travail actuel (shell), mais ne les définirait pas.Si nous écrivons un programme pour
cron
inbash
–it, il se trouve simplement qu’il est écritbash
; en fait, nous pouvons écrire danspython
ouperl
ou tout autre Progamming Langue- alors nous pouvons avoir une option pour les sourcesbash
d »~/.bash_profile
(lire: réglage du shell de l' utilisateur, qui se trouve être la même langue de votre langage de programmation):Cependant, que se passe-t-il si cet utilisateur ne l’utilise pas en
bash
tant que shell? Il / elle peut utiliserzsh
,ksh
,fish
, etc. Ainsi, cette pratique ne fonctionnerait pas vraiment lorsque le programme d' écriture pour un usage public.Donc, vous pouvez rechercher
~/.bash_profile
si cela vous convient. Mais ici, il ne s'agit pas de savoir si nous sommes en mesure de créer un fichier, mais de savoir comment les choses devraient fonctionner dans le système: le concept de conception . En bref: nous devrions considérerbash
que quelque chose a 2 rôles: shell et langage de programmation . Alors tout sera beaucoup plus facile à comprendre.la source
J'ai eu le même problème lors de l'exécution d'une application de nœud à partir de cron qui utilise NVM.
par exemple:
* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Si cela ne fonctionne pas, essayez de définir une variable de chemin dans crontab
la source
Ma façon de gérer cela était la suivante:
1) Mettre mes variables dans (la fin de)
~/.profile
:2) Créer un script Bash pour mes tâches (quotidiennes) cron (
~/cronDaily.sh
) contenant mes commandes ainsi que l’approvisionnement répétitif de~/.profle
:3) planifier l'exécution de mon script à partir de
crontab
, pour s'exécuter quotidiennement:Ma variable n'a pas été ignorée et les commandes ont été exécutées avec succès.
Certains pourraient dire qu'un tel sourçage intense
~/.profile
est problématique. Dans mon cas particulier, je ne vois pas pourquoi c'est un problème, mais je vous conseillerais de créer un fichier dédié à cela.En général, il existe peut-être un meilleur moyen de procéder mais c’est ce qui a fonctionné pour moi après beaucoup de souffrances et cela explique le principe selon lequel, à partir de Bash 4.3.46, vous ne pouvez plus créer un fichier
crontab
.la source