Ich habe die Variable "SHELL" in der Datei / etc / crontab definiert:
[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 ~]$
Außerdem werden alle meine Skripte in der Datei / etc / crontab unter dem Benutzer "martin" gestartet. Jedoch /home/martin/.bash_profile (für Login - Shell) und /home/martin/.bashrc (für Nicht-Logging - Shell) enthalten einige Variablen , die im Falle von cron - Job ignoriert werden, sind aber für den Fall , habe ich in Maschine anmelden über SSH oder neue Bash-Sitzung eröffnen. Warum ignoriert cron diese Variablen? Führt cron nicht einfach "/usr/local/bin/bashmy-script.sh" mit den Berechtigungen des Benutzers "martin" aus?
.bashrc
hat eine Linie , die sie stoppt die Ausführung von in nicht-interaktiven Shells.Antworten:
Sie können die gewünschte Datei oben im Skript oder zu Beginn des Jobs für den Benutzer, der den Job ausführt, als Quelle angeben. Der Befehl "source" ist ein integrierter Befehl. Sie würden dasselbe tun, wenn Sie Änderungen an diesen Dateien vornehmen würden, um die Änderungen zu laden.
oder
quelle
bash
Shell nicht verwendet . Ich habe eine Antwort hinzugefügt, die den Fall behandelt, wenn die Shell istsh
.Weil es keine interaktive Shell ist. Das gleiche passiert, wenn Sie einige Terminals öffnen.
Schauen Sie sich diese Frage an: Was ist die .bashrc-Datei? | Super User
Und auch bei diesem:
Was ist der Unterschied zwischen .bashrc, .bash_profile und .environment? | Paketüberfluss
Je nachdem, ob es sich bei der Verbindung um eine Anmeldeshell (oder nicht), eine interaktive Shell (oder nicht) oder beides handelt, werden verschiedene Skripte ausgelöst.
Wenn Sie bashrc machen wollen, müssen Sie diese Änderung vornehmen:
Quelle: Bash-Startdateien | Bash-Referenzhandbuch | gnu.org
quelle
Sie können möglicherweise nicht ausgeführt werden,
source
wenn diesh
Shell verwendet wird. Dies kann durch Hinzufügen der folgenden Zeile in Ihrer Crontab geändert werden:Sie können auch die Umgebung angeben:
oder Sie können Ihr lokales verwenden,
/home/user/.bashrc
wenn es ein Benutzer cron Job ist (zBcrontab -e
).Beachten Sie, dass
.bash_profile
ersetzen kann.bashrc
, wenn es existiert.Kredit: Wie man cron Oberteil ändert (sh zum heftig zu schlagen)?
quelle
SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
Etwas anderes, das die Beschaffung Ihres
.bashrc
Cronjobs beeinträchtigen könnte, sind Überprüfungen, die diese Datei vornimmt, um interaktive Shells zu erkennen.Unter Ubuntu 18.04
.bashrc
beginnt die Standardeinstellung für einen Benutzer beispielsweise folgendermaßen:und so Sourcing wird es nichts Sinnvolles tun, da es sofort beendet wird.
quelle
Sie können Bash mit der folgenden
-l
Option aufrufen :Die
-l
Option macht Bash zu einer Login- Shell. Auf diese Weise wird der Benutzer gelesen.bash_profile
. Der Benutzer wird nicht gelesen, es.bashrc
sei denn, es wird explizit von bezogen.bash_profile
. Dies liegt daran, dass nicht interaktive Shells nicht automatisch gelesen werden.bashrc
. Sie sollten jedoch keinen.bashrc
Cron-Job benötigen, um.bashrc
nützliche Einstellungen für eine interaktive Shell vorzunehmen.Variationen:
Wenn sich die Bash auf dem Pfad befindet, muss kein absoluter Pfad angegeben werden:
Eine Optimierung wäre das Ersetzen der aktuellen Shell durch
exec
:quelle
bash
verhält sich anders, egal ob es sich um eine Shell oder eine normale Programmiersprache handelt (wieperl
oderpython
).Durch Design, die Einstellungen in
~/.bash_profile
,~/.bashrc
usw. sind für die Benutzer - Set Dinge , wennbash
spielt die Rolle einer Schale (Login - Shell, interractive Shell). Denken Sie an die Umgebung, die Sie in einerxterm
(interaktiven Shell) oder inssh
Sitzungen (Anmeldeshell) oder in Konsolen (Anmeldeshell) haben.Andererseits
bash
ist es auch eine leistungsstarke Programmiersprache, die über viele Skripte zum Verwalten von Diensten nachdenkt undsystemd
einen anderen Arbeitsstil erfordert. Wenn ein Entwickler beispielsweise ein Systemskript oder einbash
Programm schreibt , möchte er den Benutzer nicht~/.bash_profile
automatisch als Quelle verwenden . Es ist ein normales Programm, keine Shell. Ein normales Programm (einschließlichbash
Programme) würde natürlich Einstellungen von der aktuellen Arbeitsumgebung (Shell) erben , diese jedoch nicht festlegen .Wenn wir ein Programm für
cron
in schreiben, wirdbash
es zufällig in geschriebenbash
. in der Tat können wir es in schreibenpython
oderperl
oder andere Progammierung sprach dann können wir eine Option Quellen habenbash
‚s~/.bash_profile
(sprich: die Benutzer-Shell - Einstellung, die nur zufällig die gleiche Sprache Ihrer Programmiersprache sein):Was ist jedoch, wenn dieser bestimmte Benutzer nicht
bash
als Shell verwendet? Er / sie verwenden kannzsh
,ksh
,fish
usw. Also, diese Praxis funktionieren würde, nicht wirklich , wenn Programm für die öffentliche Nutzung zu schreiben.Sie können also Quellen
~/.bash_profile
angeben, wenn Sie glauben, dass dies funktionieren wird. Aber hier geht es nicht darum, ob wir eine Datei beschaffen können, sondern darum, wie die Dinge im System funktionieren sollen: das Designkonzept . Kurz gesagt: Wir solltenbash
etwas mit zwei Rollen sehen: Shell und Programmiersprache . Dann wird alles viel einfacher zu verstehen sein.quelle
Ich hatte das gleiche Problem beim Ausführen einer Knotenanwendung von cron, die NVM verwendet. Um die bash-Shell zum Lesen der .bashrc-Datei von cron zu veranlassen, rufen Sie einfach den Befehl bash mit der interaktiven Shell-Option `-l auf.
z.B:
* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Wenn dies nicht funktioniert, setzen Sie die Pfadvariable in crontab
quelle
Meine Art damit umzugehen war:
1) Meine Variablen eingeben (Ende von)
~/.profile
:2) Erstellen eines Bash-Skripts für meine (täglichen) Cron-Tasks (
~/cronDaily.sh
) mit meinen Befehlen und wiederholtem Sourcing von~/.profle
:3) Planen der Ausführung meines Skripts von
crontab
, bis zur täglichen Ausführung :Meine Variable wurde nicht ignoriert und die Befehle wurden erfolgreich ausgeführt.
Einige mögen sagen, dass eine derart intensive Beschaffung
~/.profile
problematisch ist. In meinem speziellen Fall sehe ich nicht, warum es ein Problem ist, aber ich würde empfehlen, eine dedizierte Datei dafür zu erstellen.Im Allgemeinen gibt es vielleicht einen besseren Weg, aber genau das hat bei mir nach vielen Schmerzen funktioniert und erklärt das Prinzip, dass Sie ab Bash 4.3.46 keine Datei mehr aus diesem Quellcode beziehen können
crontab
.quelle