Discussion:
Unterschied terminal <> cron
(zu alt für eine Antwort)
Bernd
2019-02-28 07:12:22 UTC
Permalink
Hi,

wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
Mir, weil ich keine Ahnung habe? OK, macht mich schlau.

Das Programm läuft auch wenn das Skript von root am CLI direkt gestartet
wird. Der Cron-Eintrag erfolgte vom root aus mit 'crontab -e'.
Rufe ich das Pgm. im Skript mit vollem Pfad auf, scheint es zu laufen.

Was muss ich wissen damit ich dahinter komme? Crontab -e sorgt für einen
Eintrag 'im Rahmen' des Users unter dem es gestartet wird. /usr/sbin/
liegt im Pfad. Warum braucht das Skript wenn es von cron gestartet wird
den vollen Pfad?

Bernd
Peter Blancke
2019-02-28 08:03:55 UTC
Permalink
Warum braucht das Skript wenn es von cron gestartet wird den
vollen Pfad?
Weil Deine Pfade aus Quellen kommen (Bash oder was auch immer), die
Cron vermutlich nicht kennt.

Einstellungen am Anfang der crontab helfen weiter, bei mir steht da
beispielsweise:

SHELL=/bin/bash
MAILTO=***@example.org
PATH="/home/ich/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"

Grusz,

Peter Blancke
--
Hoc est enim verbum meum!
Josef Moellers
2019-02-28 08:08:15 UTC
Permalink
Post by Bernd
Hi,
wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
Mir, weil ich keine Ahnung habe? OK, macht mich schlau.
Das Programm läuft auch wenn das Skript von root am CLI direkt gestartet
wird. Der Cron-Eintrag erfolgte vom root aus mit 'crontab -e'.
Rufe ich das Pgm. im Skript mit vollem Pfad auf, scheint es zu laufen.
Was muss ich wissen damit ich dahinter komme? Crontab -e sorgt für einen
Eintrag 'im Rahmen' des Users unter dem es gestartet wird. /usr/sbin/
liegt im Pfad. Warum braucht das Skript wenn es von cron gestartet wird
den vollen Pfad?
Der Suchpfad ($PATH) ist im Kontext "cron" stark eingeschränkt. Entweder
man spezifiziert ihn in der crontab ("PATH=....") oder eben man ruft die
Programme mit vollem Pfad auf.
Letzteres hilft nur begrenzt, wenn die Programme ihrerseits Programma
ohne vollen Pfad aufrufen, denn dann werden diese wieder gemäß der
$PATH-Variablen gesucht. Diese wird (natürlich) von aufrufendem zu
aufgerufenen Programmüber das Environment "verebt".

Josef
Bernd
2019-02-28 08:21:33 UTC
Permalink
Post by Bernd
Hi,
wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
Mir, weil ich keine Ahnung habe? OK, macht mich schlau.
Das Programm läuft auch wenn das Skript von root am CLI direkt gestartet
wird. Der Cron-Eintrag erfolgte vom root aus mit 'crontab -e'.
Rufe ich das Pgm. im Skript mit vollem Pfad auf, scheint es zu laufen.
Was muss ich wissen damit ich dahinter komme? Crontab -e sorgt für einen
Eintrag 'im Rahmen' des Users unter dem es gestartet wird. /usr/sbin/
liegt im Pfad. Warum braucht das Skript wenn es von cron gestartet wird
den vollen Pfad?
Bernd
Erläuterung mit Beispielen :-)
Eure Antworten ergänzen sich fantastisch.

Vielen Dank,

Bernd
Helmut Harnisch
2019-02-28 08:25:16 UTC
Permalink
Post by Bernd
Warum braucht das Skript wenn es von cron gestartet wird
den vollen Pfad?
Weil eine shell mit leeren Umgebungsvariablen gestartet wird???
Ralph Aichinger
2019-02-28 08:29:08 UTC
Permalink
Post by Bernd
wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
Anders (bzw. meistens gar nicht) gesetzten Umgebungsvariablen wie PATH
Post by Bernd
Was muss ich wissen damit ich dahinter komme? Crontab -e sorgt für einen
Eintrag 'im Rahmen' des Users unter dem es gestartet wird. /usr/sbin/
liegt im Pfad. Warum braucht das Skript wenn es von cron gestartet wird
den vollen Pfad?
Weil PATH nicht gesetzt wird. Selber setzen oder vollen Pfad angeben.

/ralph
--
-----------------------------------------------------------------------------
https://aisg.at
ausserirdische sind gesund
Josef Moellers
2019-02-28 10:10:42 UTC
Permalink
Post by Ralph Aichinger
Post by Bernd
wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
Anders (bzw. meistens gar nicht) gesetzten Umgebungsvariablen wie PATH
Post by Bernd
Was muss ich wissen damit ich dahinter komme? Crontab -e sorgt für einen
Eintrag 'im Rahmen' des Users unter dem es gestartet wird. /usr/sbin/
liegt im Pfad. Warum braucht das Skript wenn es von cron gestartet wird
den vollen Pfad?
Weil PATH nicht gesetzt wird. [...]
Einspruch, Euer Ehren: PATH wird schon gesetzt, nur es wird auf eine
minimale Suchliste gesetzt:

Several environment variables are set up automatically by the cron(8)
daemon. [...] PATH is set to "/usr/bin:/bin".

(Sorry, mein System ist auf englisch eingestellt)

Josef
Ralph Aichinger
2019-02-28 10:26:14 UTC
Permalink
Post by Josef Moellers
Post by Ralph Aichinger
Weil PATH nicht gesetzt wird. [...]
Einspruch, Euer Ehren: PATH wird schon gesetzt, nur es wird auf eine
Danke für die Korrektur.

/ralph
--
-----------------------------------------------------------------------------
https://aisg.at
ausserirdische sind gesund
Helmut Waitzmann
2019-02-28 22:33:15 UTC
Permalink
Post by Bernd
wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
… der Umgebungsvariablen »PATH«, deren Inhalt sich im einen Fall
vom anderen Fall unterscheidet. Gesucht wird in den
Verzeichnissen, die in der Variablen »PATH« aufgeführt sind.
Post by Bernd
Das Programm läuft auch wenn das Skript von root am CLI direkt gestartet
wird.
Du hast richtig beobachtet: Dasselbe Skript findet das Kommando
dann, wenn es aus einem Terminal gestartet wird. Wenn es aus
einem Crontab gestartet wird, findet es das Kommando nicht.
Ursache ist ein Unterschied in der Belegung der Umgebungs‐ und
Shell‐Variablen »PATH«.

Du könntest das adhoc hinbiegen, indem Du mit »crontab -e« nicht
nur den Kommandoaufruf, sondern auch den Inhalt der
Umgebungsvariablen »PATH« (siehe das Handbuch »crontab(5)«)
festlegst.

Aber eigentlich rate ich Dir zu etwas anderem, weil so eine
Variablenbelegung mit Crontab sich nicht auf die Inhalte anderer
Umgebungsvariabler – etwa »HOME« – beziehen kann und weil auch
andere Umgebungsvariable noch betroffen sein können, sodass das
händische Eintragen von Umgebungsvariablenwerten zu einer immer
unvollständig bleibenden Fummelei ausartet:

Der entscheidende Unterschied zwischen dem Einloggen an einem
Terminal und dem Start vom Crontab aus: Beim Einloggen erhält man
einen Login‐Shell (s. u.), beim Crontab einen Nicht‐Login‐Shell.

Anstatt ins Crontab als Kommando nur

»'das Bash-Skript' mit Parametern ...«

reinzuschreiben, schreibe das folgende Kommando (alles in eine
lange Zeile, hier nur zur besseren Lesbarkeit umbrochen) hinein:

»bash -c -- '"$@"' bash exec -a -"${SHELL##*/}" -- "$SHELL" -c --
'"$@"' "${SHELL##*/}" 'das Bash-Skript' mit Parametern ...«

Das bewirkt, dass ein Bash gestartet wird, das einen »"$SHELL"« als
Login‐Shell startet, der das gewünschte »Bash-Skript« startet.

Der Login‐Shell kann sich eine vernünftige Umgebung schaffen, ehe
er die beabsichtigten Kommandos startet, der Nicht‐Login‐Shell
kann das nicht.

Wenn der Systemadministrator den Login‐Shell richtig konfiguriert
hat, erhältst Du damit eine Umgebung ähnlich der beim Einloggen an
einem Terminal.

Für die Einzelheiten muss ich etwas ausholen:

Wenn man sich an einem Terminal einloggt, startet das Programm
»login« nach erfolgreicher Passwortprüfung den Shell, der in der
Benutzerdatenbank für den Benutzer als Shell eingetragen ist; und
zwar startet es ihn mit einem besonderen Aufrufnamen Aufrufnamen
(engl.: invocation name, auch bekannt unter den Namen »arg0«
bzw. »argv[0]«, siehe im Handbuch die Kapitel »exec(3)« und
»execve(2)«): Für den Aufrufnamen nimmt es die letzte Komponente
des Dateinamens des Shells, mit einem vorangestellten
Minuszeichen.

An einem Beispiel wird das klarer:

Angenommen, für root sei »/bin/bash« als Shell in der
Benutzerdatenbank vermerkt. Dann ruft das Programm »login«, wenn
sich »root« an einem Terminal einloggt, »/bin/bash« mit dem
invocation name »-bash« auf.

Das hat folgenden Zweck: Shells sind üblicherweise so
programmiert, dass sie sich beim Start ihren Aufrufnamen
anschauen: Beginnt der mit einem Minuszeichen, verhalten sie sich
als Login‐Shell, sonst nicht.

Logge Dich mal an einem Terminal ein und lasse folgendes Kommando
laufen:

»ps -o ruser -o ppid -o pid -o stat -o args=ARGV -p "$$"«

In der Spalte »ARGV« sieht man das Minuszeichen am Aufrufnamen des
Shells, das ihn zum Login‐Shell macht.

Schreibe zum Vergleich dasselbe Kommando in das Crontab und sieh
Dir die Dir per E‐Mail zugeschickte Ausgabe an.

Login‐Shells verhalten sich anders, als Nicht‐Login‐Shells: Sie
arbeiten beim Start zuerst bestimmte Startup‐Dateien (in denen
Shell‐Kommandos stehen) ab. Das erlaubt dem Systemadministrator
und dem Benutzer, der den Login‐Shell starten lässt, eine
vernünftige Umgebung (u. a. die Umgebungsvariable »PATH«)
aufzusetzen.

Schau beispielsweise im Handbuch »bash(1)« den Abschnitt
»INVOCATION« an. Dort ist die Sache mit dem Minuszeichen im
Aufrufnamen und die Option »--login« beschrieben, und auch,
welche Startup‐Dateien »bash« dann abarbeitet.
Bernd
2019-03-01 08:26:30 UTC
Permalink
Am 28.02.19 um 23:33 schrieb Helmut Waitzmann:
(...)
Post by Helmut Waitzmann
Du hast richtig beobachtet: Dasselbe Skript findet das Kommando
dann, wenn es aus einem Terminal gestartet wird. Wenn es aus einem
Crontab gestartet wird, findet es das Kommando nicht. Ursache ist ein
Unterschied in der Belegung der Umgebungs‐ und Shell‐Variablen
»PATH«.
Du könntest das adhoc hinbiegen, indem Du mit »crontab -e« nicht nur
den Kommandoaufruf, sondern auch den Inhalt der Umgebungsvariablen
»PATH« (siehe das Handbuch »crontab(5)«) festlegst.
Ich habe es inzwischen erledigt indem ich das benötigte Programm inkl.
Pfad in einer Variablen den Skript hinzugefügt habe. Der Aufruf
geschieht nun über diese Variable.
Post by Helmut Waitzmann
Aber eigentlich rate ich Dir zu etwas anderem,
(...)
Post by Helmut Waitzmann
reinzuschreiben, schreibe das folgende Kommando (alles in eine lange
Das bewirkt, dass ein Bash gestartet wird, das einen »"$SHELL"« als
Login‐Shell startet, der das gewünschte »Bash-Skript« startet.
Cool ;-)
(...)
Post by Helmut Waitzmann
Wenn man sich an einem Terminal einloggt, startet das Programm
»login« nach erfolgreicher Passwortprüfung den Shell, der in der
Benutzerdatenbank für den Benutzer als Shell eingetragen ist; und
zwar startet es ihn mit einem besonderen Aufrufnamen Aufrufnamen
(engl.: invocation name, auch bekannt unter den Namen »arg0« bzw.
Für den Aufrufnamen nimmt es die letzte Komponente des Dateinamens
des Shells, mit einem vorangestellten Minuszeichen.
Angenommen, für root sei »/bin/bash« als Shell in der
Benutzerdatenbank vermerkt. Dann ruft das Programm »login«, wenn
sich »root« an einem Terminal einloggt, »/bin/bash« mit dem
invocation name »-bash« auf.
Das hat folgenden Zweck: Shells sind üblicherweise so programmiert,
dass sie sich beim Start ihren Aufrufnamen anschauen: Beginnt der
mit einem Minuszeichen, verhalten sie sich als Login‐Shell, sonst
nicht.
Logge Dich mal an einem Terminal ein und lasse folgendes Kommando
»ps -o ruser -o ppid -o pid -o stat -o args=ARGV -p "$$"«
In der Spalte »ARGV« sieht man das Minuszeichen am Aufrufnamen des
Shells, das ihn zum Login‐Shell macht.
Ah ja, hier sieht es in einem 'echten' Terminal und in einem virtuellen
Terminal auf der GUI anders aus. (Das virtuelle Terminal ist eben keine
Login-Shell)
Post by Helmut Waitzmann
Schreibe zum Vergleich dasselbe Kommando in das Crontab und sieh Dir
die Dir per E‐Mail zugeschickte Ausgabe an.
Login‐Shells verhalten sich anders, als Nicht‐Login‐Shells: Sie
arbeiten beim Start zuerst bestimmte Startup‐Dateien (in denen
Shell‐Kommandos stehen) ab. Das erlaubt dem Systemadministrator und
dem Benutzer, der den Login‐Shell starten lässt, eine vernünftige
Umgebung (u. a. die Umgebungsvariable »PATH«) aufzusetzen.
Vielen Dank für die verständliche und lesenswerte Darstellung des
Sachverhalts!
So habe ich wieder etwas gelernt (ich ahnte ja schon das es mit dem Pfad
zusammen hängt, aber die Ursache war mir nicht völlig klar.)
Post by Helmut Waitzmann
Schau beispielsweise im Handbuch »bash(1)« den Abschnitt »INVOCATION«
an. Dort ist die Sache mit dem Minuszeichen im Aufrufnamen und die
Option »--login« beschrieben, und auch, welche Startup‐Dateien »bash«
dann abarbeitet.
Hat man erstmal verstanden wie es funktioniert, versteht man
anschließend auch die Beschreibung ;-)

Bernd
Helmut Waitzmann
2019-03-01 09:50:30 UTC
Permalink
Post by Bernd
(...)
Post by Helmut Waitzmann
Du hast richtig beobachtet: Dasselbe Skript findet das Kommando
dann, wenn es aus einem Terminal gestartet wird. Wenn es aus einem
Crontab gestartet wird, findet es das Kommando nicht. Ursache ist ein
Unterschied in der Belegung der Umgebungs‐ und Shell‐Variablen
»PATH«.
Du könntest das adhoc hinbiegen, indem Du mit »crontab -e« nicht nur
den Kommandoaufruf, sondern auch den Inhalt der Umgebungsvariablen
»PATH« (siehe das Handbuch »crontab(5)«) festlegst.
Ich habe es inzwischen erledigt indem ich das benötigte Programm inkl.
Pfad in einer Variablen den Skript hinzugefügt habe. Der Aufruf
geschieht nun über diese Variable.
Das Problem dabei ist halt folgendes: Sollte der
Systemadministrator eines Tages das benötigte Programm
beispielsweise in einer Fassung, in der er etwa Fehler verbessert
hat, nach »/usr/local/bin/« installieren, profitiert das Skript –
ohne, dass man es ändert – davon nicht. => Der Wartungsaufwand
für das System steigt.

[…]
Post by Bernd
Post by Helmut Waitzmann
Logge Dich mal an einem Terminal ein und lasse folgendes Kommando
»ps -o ruser -o ppid -o pid -o stat -o args=ARGV -p "$$"«
In der Spalte »ARGV« sieht man das Minuszeichen am Aufrufnamen des
Shells, das ihn zum Login‐Shell macht.
Ah ja, hier sieht es in einem 'echten' Terminal und in einem virtuellen
Terminal auf der GUI anders aus. (Das virtuelle Terminal ist eben keine
Login-Shell)
Ja. Genaugenommen liegt es aber nicht am unterschiedlichen
Terminal sondern daran, dass am echten Terminal beim Einloggen
zunächst das Programm »login« läuft. »login« startet dann einen
Login‐Shell über den Mechanismus mit dem Minuszeichen am Anfang
von »argv[0]«. Würde das virtuelle Terminal seinen Shell ebenso
mit Minuszeichen im »argv[0]« starten, bekäme man ebenfalls einen
Login‐Shell. (Dem Xterm kann man das mit der Option »-ls« oder
dem X‐Resource »loginShell« sogar beibringen. Aber da ein Xterm
in der Regel erst nach dem Login an der grafischen Umgebung
gestartet wird, ist, einen Login‐Shell aus einem Xterm, das selbst
bereits eine von einem (grafischen) Login aufgesetzte Umgebung
geerbt hat, zu starten, im Allgemeinen eher kontraproduktiv als
hilfreich.)

[…]
Post by Bernd
Hat man erstmal verstanden wie es funktioniert, versteht man
anschließend auch die Beschreibung ;-)
Genau. Ich vermute, das hat damit zu tun, dass die Beschreibung
im »bash(1)«‐Handbuch top‐down vorgeht, während bei bottom‐up
(»execve()« verstehen, die Eigenheit von »login«, »argv[0]« mit
einem Minuszeichen zu versehen, kennen, vom Interesse des Shells
an »argv[0]« wissen) die Liste der bereits gestellten, aber noch
nicht beantworteten Verständnisfragen nicht so lang wird.
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Bernd
2019-03-03 10:22:50 UTC
Permalink
Post by Helmut Waitzmann
Post by Bernd
(...)
Post by Helmut Waitzmann
Du hast richtig beobachtet: Dasselbe Skript findet das Kommando
dann, wenn es aus einem Terminal gestartet wird. Wenn es aus einem
Crontab gestartet wird, findet es das Kommando nicht. Ursache ist ein
Unterschied in der Belegung der Umgebungs‐ und Shell‐Variablen
»PATH«.
Du könntest das adhoc hinbiegen, indem Du mit »crontab -e« nicht nur
den Kommandoaufruf, sondern auch den Inhalt der Umgebungsvariablen
»PATH« (siehe das Handbuch »crontab(5)«) festlegst.
Ich habe es inzwischen erledigt indem ich das benötigte Programm inkl.
Pfad in einer Variablen den Skript hinzugefügt habe. Der Aufruf
geschieht nun über diese Variable.
Das Problem dabei ist halt folgendes: Sollte der
Systemadministrator eines Tages das benötigte Programm
beispielsweise in einer Fassung, in der er etwa Fehler verbessert
hat, nach »/usr/local/bin/« installieren, profitiert das Skript –
ohne, dass man es ändert – davon nicht. => Der Wartungsaufwand
für das System steigt.
Hmm, ja, das kann man so sehen. Ich dachte mir das ich so den Pfad im
Skript ggf. nur einmal anpassen muss.

(...)
Post by Helmut Waitzmann
Post by Bernd
Hat man erstmal verstanden wie es funktioniert, versteht man
anschließend auch die Beschreibung ;-)
Genau. Ich vermute, das hat damit zu tun, dass die Beschreibung
im »bash(1)«‐Handbuch top‐down vorgeht, während bei bottom‐up
(»execve()« verstehen, die Eigenheit von »login«, »argv[0]« mit
einem Minuszeichen zu versehen, kennen, vom Interesse des Shells
an »argv[0]« wissen) die Liste der bereits gestellten, aber noch
nicht beantworteten Verständnisfragen nicht so lang wird.
... und ich gebe zu das ich das nicht um seiner selbst Willen lerne.
Wenn es mir auffällt, ich es brauche, lerne ich es halt. Und zwar auf
die schnellste und mir angenehmste Art. Und dazu gehört fragen ;-)

#man 1 bash ist echt ... puuh ... viel ...

Jetzt habe habe ich den Grund für das Verhalten des Cron gelernt und
gleich noch einige Dinge am Rande mit. (Von Login-Shells und
Nicht-Login-Shells und was sie unterscheidet hatte ich zwar schon
gehört, aber die Zusammenhänge bisher einfach hingenommen.


Nochmal vielen Dank!

Bernd
Helmut Waitzmann
2019-03-03 17:09:55 UTC
Permalink
[…]
Post by Bernd
Post by Helmut Waitzmann
Post by Bernd
Hat man erstmal verstanden wie es funktioniert, versteht man
anschließend auch die Beschreibung ;-)
Genau. Ich vermute, das hat damit zu tun, dass die Beschreibung
im »bash(1)«‐Handbuch top‐down vorgeht, während bei bottom‐up
(»execve()« verstehen, die Eigenheit von »login«, »argv[0]« mit
einem Minuszeichen zu versehen, kennen, vom Interesse des Shells
an »argv[0]« wissen) die Liste der bereits gestellten, aber noch
nicht beantworteten Verständnisfragen nicht so lang wird.
... und ich gebe zu das ich das nicht um seiner selbst Willen lerne.
Wenn es mir auffällt, ich es brauche, lerne ich es halt.
Das reicht ja.
Post by Bernd
Und zwar auf die schnellste und mir angenehmste Art. Und dazu
gehört fragen ;-)
Usenet at its best!
Post by Bernd
#man 1 bash ist echt ... puuh ... viel ...
… besonders, weil es davon ausgeht, dass der Leser Unix schon
einigermaßen kennt: in Deinem Fall die Prozessumgebung mit den
Umgebungsvariablen – im Besonderen der Variablen »PATH« –, die
Programmstart‐Funktion »execvp()«, die auf der Suche nach dem zu
startenden Programm oder Skript die in der Variablen »PATH«
genannten Verzeichnisse abklappert, der Parameter »argv[]« dieser
Funktion, der die Parameterliste für das zu startende Programm
enthält, das erste Element dieser Liste (»argv[0]«), mit dem dem
zu startenden Programm mitgeteilt wird, wie es heißt (seinen
Aufrufnamen), das Programm »login«, das den Aufrufnamen
eigenwillig mit dem Minuszeichen abändert, die Shells, die beim
Start nach diesem Minuszeichen Ausschau halten, um zu entscheiden,
ob sie ein Login‐Shell sein wollen, also bestimmte Startup‐Dateien
abarbeiten wollen, der Unterschied zwischen dem Einloggen an der
Konsole, wo das Programm »login« läuft, und dem Starten von »cron«
aus, der im Gegensatz zu »login« nichts mit Minuszeichen am Hut
hat, und schließlich das Bash‐Kommando »exec« mit der Option »-a«,
mit deren Hilfe man den Aufrufnamen wie bei »execvp()«
ausdrücklich angeben kann.

Eigentlich wundert es mich schon, dass »cron« nicht wie »login«
mit dem Minuszeichen ans Werk geht. Aber das ist wahrscheinlich
historisch bedingt.

Bei Handbuchseiten lohnt es sich oft, gleich nachzuschauen, ob es
die Abschnitte »FILES« und »SEE ALSO« gibt. Möglicherweise bringt
einen auch das Kommando

»man -k -- ein_Suchbegriff«

weiter.
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Juergen Ilse
2019-03-01 02:50:40 UTC
Permalink
Hallo,
Post by Bernd
wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
Mir, weil ich keine Ahnung habe? OK, macht mich schlau.
Das Programm läuft auch wenn das Skript von root am CLI direkt gestartet
wird. Der Cron-Eintrag erfolgte vom root aus mit 'crontab -e'.
Rufe ich das Pgm. im Skript mit vollem Pfad auf, scheint es zu laufen.
Wenn du bereits eine Loesung gefunden hast, warum benutzt du sie dann nicht?
Abgesehen davon: Wo und in welcher Reihenfolge wird denn nach ausfuehrbaren
Programmen von der shell gesucht? Spielt da vielleicht die Environment
Variable "PATH" eine Rolle? Koennte die evt. in deinen interaktiven shells
und dem "cron Environment" unterschiedlich gesetzt sein? Nur mal so als
Denkanstoss, wie du denn selbst die Erklaerung und evt. eine moegliche andere
Loesung finden kannst. Wenn du nicht selbst nachdenken willst, solltest du
dir besser ein System suchen, dass versucht dir das denken abzunehmen (nein,
die meisten Linux Distributionen tun das nicht) ...
Post by Bernd
Was muss ich wissen damit ich dahinter komme? Crontab -e sorgt für einen
Eintrag 'im Rahmen' des Users unter dem es gestartet wird. /usr/sbin/
liegt im Pfad.
PATH ist eine Environment Variable. und Environment Variablen sind
spezifisch fuer jeden einzelnen Prozess, werden aber ggfs. an Child-
Prozesse vererbt. Deine interaktiven shells sind childs von deiner
login shell, in der (u.a. durch .bash_profile) ein passendes Environment
gesetzt wurde. der cron job ist aber kein child von deiner login shell
und erbt daher von dieser kein Environment ...
Post by Bernd
Warum braucht das Skript wenn es von cron gestartet wird
den vollen Pfad?
Das solltest du mit etwas nachdenken und meinen oben stehenden Erklaerungen
selbst herausfinden koennen ...

Tschuess,
Juergen Ilse (juergenqusenet-verwaltung.de)
Josef Moellers
2019-03-01 07:41:05 UTC
Permalink
Post by Juergen Ilse
Hallo,
Post by Bernd
wenn ein Kommando was in /usr/sbin/ liegt, als root am CLI interaktiv
aufgerufen wird, funktioniert, es aber wenn es von cron aus einem
Bash-Skript heraus gestartet wird, nicht gefunden wird liegt das an ...?
Mir, weil ich keine Ahnung habe? OK, macht mich schlau.
Das Programm läuft auch wenn das Skript von root am CLI direkt gestartet
wird. Der Cron-Eintrag erfolgte vom root aus mit 'crontab -e'.
Rufe ich das Pgm. im Skript mit vollem Pfad auf, scheint es zu laufen.
Wenn du bereits eine Loesung gefunden hast, warum benutzt du sie dann nicht?
"Gib jemanden einen Fisch und er wird einen Tag nicht hungern. Lehre
jemanden zu fischen und er wird nie wieder hungern!"

Es ist schön, eine Lösung zu wissen, es ist besser, die Hintergründe zu
kennen, weil man sonst, beim nächsten /etwas/ anders gelagerten Fall
wieder Probleme bekommt!
Mal ganz abgesehen davon: wenn das Kommando ein Shell-Skript ist,
welches andere Programm OHNE Angabe des vollen Pfads aufruft (achnee ...
natürlich setzen wir alle die PATH-Variable in JEDEM Shell-Skript
explizit! NICHT!!!) oder ein "Binärprogramm" welches popen() benutzt,
hilft es wenig, das Programm mit dem vollen Pfad aufzurufen, weil dann
die Probleme auf der nächsten Stufe lauern.
Post by Juergen Ilse
Abgesehen davon: Wo und in welcher Reihenfolge wird denn nach ausfuehrbaren
Programmen von der shell gesucht? Spielt da vielleicht die Environment
Variable "PATH" eine Rolle?
Bernd schrieb "Mir, weil ich keine Ahnung habe?" ... vielleicht kennt er
$PATH nicht oder hat es nie benutzt und es ist ihm nicht so präsent wie
uns, die wir vielleicht alle schon einmal über genau dieses Problem
gestolpert sind (oder ab und an sogar noch 'drüber stolpern)!


BTDATGT (Been there, done all that, got T-Shirt)!

Josef

PS "Unix [und damit auch Linux] hat eine Lernkurve, so steil wie die
Eiger-Nordwand."
Juergen Ilse
2019-03-01 14:00:48 UTC
Permalink
Hallo,
Post by Josef Moellers
"Gib jemanden einen Fisch und er wird einen Tag nicht hungern. Lehre
jemanden zu fischen und er wird nie wieder hungern!"
Ich habe auch mal eine andere Variante gehoert:

"Gib jemanden einen Fisch und er wird einen Tag nicht hungern. Erklaere
jemanden wie man angelt und er wird dich wuetend anbpoebeln und dir er-
klaeren, dass er besseres zu tun habe, als den ganzen Tag lang Schnuere
mit am Ende befestigten mit einem Wurm garnierten Haken an einem Stock
ins Wasser haengen zu lassen ..."

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Andreas Eder
2019-03-02 22:44:51 UTC
Permalink
Post by Juergen Ilse
Hallo,
Post by Josef Moellers
"Gib jemanden einen Fisch und er wird einen Tag nicht hungern. Lehre
jemanden zu fischen und er wird nie wieder hungern!"
"Gib jemanden einen Fisch und er wird einen Tag nicht hungern. Erklaere
jemanden wie man angelt und er wird dich wuetend anbpoebeln und dir er-
klaeren, dass er besseres zu tun habe, als den ganzen Tag lang Schnuere
mit am Ende befestigten mit einem Wurm garnierten Haken an einem Stock
ins Wasser haengen zu lassen ..."
Tschuess,
Also meine Lieblingsversion eines solchen Spruchs stammt von Terry
Pratchett:

“Give a man a fire and he's warm for a day, but set fire to him and he's warm for the rest of his life.”

― Terry Pratchett, Jingo

Mehr muss man dazu nicht sagen :-)


'Andreas
Juergen Ilse
2019-03-01 14:10:44 UTC
Permalink
Hallo,
Post by Josef Moellers
Bernd schrieb "Mir, weil ich keine Ahnung habe?" ... vielleicht kennt er
$PATH nicht oder hat es nie benutzt und es ist ihm nicht so präsent wie
uns, die wir vielleicht alle schon einmal über genau dieses Problem
gestolpert sind (oder ab und an sogar noch 'drüber stolpern)!
Eine Environtvariable "PATH" die genau das beeinflusst, findet sich sogar
in MSDOS und *JEDEM* Windows wieder, darueber hinaus vermutlich in fast
jedem anderen heute gebrauchlichem Betriebssystem (teils sogar in embedded
Systemen). Wer nicht voellig unwissend und/oder ignorant durch die EDV-Welt
gewandelt ist, duerfte dem schon einmal irgendwo begegnet sein ...
Post by Josef Moellers
PS "Unix [und damit auch Linux] hat eine Lernkurve, so steil wie die
Eiger-Nordwand."
Die Lernkurve ist steil, aber weit entfernt von "Eiger Nordwand". Und die
fuer "Enduser" relevanten Dinge sind besser dokumentiert als bei den meisten
anderen einigermassen verbreiteten Betriebssystemen. Das grosse Problem bei
Linux ist es oftmals, den "Schrott" an falschen Erklaerungen auszufiltern.
Dazu ist es aber selten hinlfreich, ohne einen Vorabversuch an Informations-
beschaffung (z.B. aus Buechern, Distributionsdokumentation oder mit Hilfe
der Suchmischine des eigenen geringsten Misstrauens) zu versuchen.

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Tim Landscheidt
2019-03-01 17:09:51 UTC
Permalink
Post by Juergen Ilse
[…]
Post by Josef Moellers
PS "Unix [und damit auch Linux] hat eine Lernkurve, so steil wie die
Eiger-Nordwand."
Die Lernkurve ist steil, aber weit entfernt von "Eiger Nordwand". Und die
fuer "Enduser" relevanten Dinge sind besser dokumentiert als bei den meisten
anderen einigermassen verbreiteten Betriebssystemen. Das grosse Problem bei
Linux ist es oftmals, den "Schrott" an falschen Erklaerungen auszufiltern.
Dazu ist es aber selten hinlfreich, ohne einen Vorabversuch an Informations-
beschaffung (z.B. aus Buechern, Distributionsdokumentation oder mit Hilfe
der Suchmischine des eigenen geringsten Misstrauens) zu versuchen.
Du schreibst es doch selbst: Wie soll gerade ein Einsteiger
erkennen, was „Schrott“ ist und was nicht?

Ich habe selbst schon (richtige) Lösungen für ein Problem in
Dokumentationen gefunden und dann später erkannt, dass ich
den betreffenden Absatz ein paar Jahre vorher selber ge-
schrieben hatte. Das lag nicht an mangelndem Einsatz meiner-
seits, sondern daran, dass ich in der Zwischenzeit ein paar
Tausend andere Probleme zu lösen hatte. Und nebenbei noch
meinen Lebensunterhalt verdienen musste. Und. Und. Und.

Alleine schon die richtigen Begriffe zu finden, mit denen
man sein Problem beschreiben muss, um Lösungen zu finden,
ist eine Kunst für sich, einmal ganz davon abgesehen, dass
man das Problem häufig an der falschen Stelle vermutet.

Tim
Juergen Ilse
2019-03-01 19:22:56 UTC
Permalink
Hallo,
Post by Tim Landscheidt
Alleine schon die richtigen Begriffe zu finden, mit denen
man sein Problem beschreiben muss, um Lösungen zu finden,
ist eine Kunst für sich, einmal ganz davon abgesehen, dass
man das Problem häufig an der falschen Stelle vermutet.
Nehmen wir diesen Fall und als Suchbegriffe die wichtigsten Begriffe aus
seiner Problembeschreibung: "cron" und "pfad": meine bevorzugte Suchmaschine
liefert bei Eingabe von "cron + pfad" (ohne Anfuehrungszeichen eingegeben)
als die ersten beiden Treffer zwei Artikel von "Stack Overflow", die mit an
Sicherheit grenzender Wahrscheinlichkeit beide hilfreich und brauchbar sind:
https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths
https://stackoverflow.com/questions/10129381/crontab-path-and-user

Wirklich zu schwer? In diesem Fall zumindest offenbar nicht ...

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Helmut Waitzmann
2019-03-02 12:37:26 UTC
Permalink
Post by Juergen Ilse
Hallo,
Post by Tim Landscheidt
Alleine schon die richtigen Begriffe zu finden, mit denen
man sein Problem beschreiben muss, um Lösungen zu finden,
ist eine Kunst für sich, einmal ganz davon abgesehen, dass
man das Problem häufig an der falschen Stelle vermutet.
Nehmen wir diesen Fall und als Suchbegriffe die wichtigsten Begriffe aus
seiner Problembeschreibung: "cron" und "pfad": meine bevorzugte Suchmaschine
liefert bei Eingabe von "cron + pfad" (ohne Anfuehrungszeichen eingegeben)
als die ersten beiden Treffer zwei Artikel von "Stack Overflow", die mit an
https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths
… kommt gegen die hier gegebenen Antworten nicht an: enthält mehr
fcashle oder zumindest halbgare Antworten als hier, unter anderem
auch mindestens eine, die potentiell ein Sicherheitsrisiko
darstellt.
Post by Juergen Ilse
https://stackoverflow.com/questions/10129381/crontab-path-and-user
Auch hier: jede Menge halbgare Antworten, die nur im Spezialfall
des Antwortenden funktioniert haben.

Anscheinend sieht es wirklich so aus: Will man weiterhin
rumdoktern, nehme man eine Suchmaschine; will man wirklich
vorankommen, nehme man das Usenet.
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Juergen Ilse
2019-03-03 17:39:57 UTC
Permalink
Hallo,
Post by Helmut Waitzmann
Post by Juergen Ilse
Nehmen wir diesen Fall und als Suchbegriffe die wichtigsten Begriffe aus
seiner Problembeschreibung: "cron" und "pfad": meine bevorzugte Suchmaschine
liefert bei Eingabe von "cron + pfad" (ohne Anfuehrungszeichen eingegeben)
als die ersten beiden Treffer zwei Artikel von "Stack Overflow", die mit an
https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths
… kommt gegen die hier gegebenen Antworten nicht an: enthält mehr
fcashle oder zumindest halbgare Antworten als hier, unter anderem
auch mindestens eine, die potentiell ein Sicherheitsrisiko
darstellt.
Post by Juergen Ilse
https://stackoverflow.com/questions/10129381/crontab-path-and-user
Auch hier: jede Menge halbgare Antworten, die nur im Spezialfall
des Antwortenden funktioniert haben.
Welche Antworten sollen da "halbgar" sein oder "nur im Spezialfall
funktionieren? OK, eine Antwort, die behauptet hat, der im Login
Environment des Users gesetzte PATH wuerde ueberschrieben, ist tat-
saechlich nicht korrekt gewesen, aber ansonsten?
Post by Helmut Waitzmann
Anscheinend sieht es wirklich so aus: Will man weiterhin
rumdoktern, nehme man eine Suchmaschine; will man wirklich
vorankommen, nehme man das Usenet.
Im usenet lese ich regelmaessig mindestens genauso viel Kaese wie in
den besseren Treffern der Suchmaschinen (und ja, diese beiden Links
auf stackoverflow zaehle ich zu den besseren Treffern).

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Helmut Waitzmann
2019-03-04 09:16:26 UTC
Permalink
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
Nehmen wir diesen Fall und als Suchbegriffe die wichtigsten Begriffe aus
seiner Problembeschreibung: "cron" und "pfad": meine bevorzugte Suchmaschine
liefert bei Eingabe von "cron + pfad" (ohne Anfuehrungszeichen eingegeben)
als die ersten beiden Treffer zwei Artikel von "Stack Overflow", die mit an
https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths
… kommt gegen die hier gegebenen Antworten nicht an: enthält mehr
fcashle oder zumindest halbgare Antworten als hier, unter anderem
auch mindestens eine, die potentiell ein Sicherheitsrisiko
darstellt.
| The magic, simple and correct command to have your profile
| included in current environment is source /etc/profile, it
| should eat .bashrc and a whole lot of other potentially missing
| things for you.

| This has the username field, as used by /etc/crontab.
| # /etc/crontab: system-wide crontab
| # Unlike any other crontab you don't have to run the `crontab'
| # command to install the new version when you edit this file.
| # This file also has a username field, that none of the other crontabs do.
|
| SHELL=/bin/sh
| PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
| # m h dom mon dow user command
| 42 6 * * * root run-parts --report /etc/cron.daily
| 47 6 * * 7 root run-parts --report /etc/cron.weekly
| 52 6 1 * * root run-parts --report /etc/cron.monthly
| 01 01 * * 1-5 root python /path/to/file.py

Geht an der Fragestellung des OP vorbei.

| If you don't know where the command is that you want execute
| which <command> from your shell and it'll tell you the path.

Diese Falschinformation scheint nicht totzukriegen zu sein: Nicht
»which« sondern »command -v -- gesuchtes_Kommando« wäre die
richtige Antwort gewesen.

| So once your program is running, the first thing it should do is
| set PATH and any other required variable (e.g. LD_LIBRARY_PATH)
| to the values that are required for the script to run.

»and any other required variable«: Das ist in der Tat ein guter
Rat. Nur, wie denn? Das war die Frage des OP.

| if its in your path use 'which command' and it will give you
| the full path – Paul Whelan Mar 5 '10 at 16:09
|
| @Douglas Leeder -- When you say put the full path's into
| cron, do you mean put it into crontab or another file? If it
| is how would you go about that if the cron command is: '01
| 01 * * * command'. Thanks – chrissygormley Mar 5 '10 at
| 16:13
|
| @chrissygormley - Yes crontab. – Douglas Leeder Mar 5 '10 at
| 16:31
|
| Sorry there must be some confusion. I have reworded the
| question above. – chrissygormley Mar 5 '10 at 17:08

Dito.

| Execute crontab with login option!
|
| CRONTAB run script or command with Environment Variables
|
| 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php'
| 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh

Das geht in die richtige Richtung, funktioniert aber nur dann, wenn
dem OP auch Bash statt ein POSIX‐Shell als Login‐Shell taugt.

| 1.
|
| make sure that you have the variables you need in PYTHONPATH
| (found here and here and for more info here) inside the
| .profile or .bash_profile for any shell you want to test
| your script in to make sure it works.
|
| 2.
|
| edit your crontab to include the directories needed to run
| your script in a cron job (found here and here)
|
| a) be sure to include the root directory in the PATH
| variable (.) as explained here (basically if you are running
| an executable with your command it needs to be able to find
| root or the directory where the executable is stored) and
| probably these (/sbin:/bin:/usr/sbin:/usr/bin)
|
| 3.
|
| in your crontab file, create a cronjob that will change
| directory to the directory where you have successfully ran
| the script before (i.e. Users/user/Documents/foo)
|
| a) This will look like the following:
|
| * * * * cd /Users/user/Documents/foo; bar -l doSomething -v

Tut nur die Hälfte von dem, was getan werden müsste. Aber das
macht ja nichts, denn es gibt gratis noch einen exploit dazu.

| The simplest workaround I've found looks like this:
|
| * * * * * root su -l -c command
|
| This example invokes su as root user and starts the shell with
| the user's full environment, including $PATH, set as if they
| were logged in. It works the same on different distros, is more
| reliable than sourcing .bashrc (which hasn't worked for me) and
| avoids hardcoding specific paths which can be a problem if
| you're providing an example or setup tool and don't know what
| distro or file layout on the user's system.
|
| You can also specify the username after su if you want a
| different user than root, but you should probably leave the root
| parameter before su command since this ensures su has sufficient
| privileges to switch to any user you specify.

Gibt zwar eine richtige Umgebung, hilft aber dem OP, dem es um
sein persönliches crontab, nicht um das von »root« geht, nicht.
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
https://stackoverflow.com/questions/10129381/crontab-path-and-user
Auch hier: jede Menge halbgare Antworten, die nur im Spezialfall
des Antwortenden funktioniert haben.
| You'll need to set any variables you're depending on (like
| $PATH), or replace them with something else - EG $USER becomes
| $(whoami).

»USER="$(id -run)"«

wäre richtig gewesen.

|
| I also like to write my bash scripts to use "set -eu" and "set -o
| pipefail". The -eu says "exit on a nonzero exit code, and exit on
| an undefined variable reference", and the pipefail says "don't
| return the last exit code in a pipeline, instead return the first
| exit code that's nonzero in a pipeline".

»The return value of a pipeline is the value of the last
(rightmost) command to exit with a non-zero status, or zero if all
commands in the pipeline exit successfully«

wäre richtig gewesen. Und das hat wirklich nichts damit zu tun,
dass die Angelegenheit sehr kompliziert wäre. Dazu muss man nur
das Handbuch sorgfältig lesen.

#!/bin/sh
source /etc/profile
/usr/bin/env > /home/<me>/cron_env.log

ist nicht die richtige Methode, um einen Ersatz für einen
Login‐Shell zu erhalten.

»All above didn't worked for me, So I just added Source in my bash
file and it worked! Thanks«

ist auch nicht besser.

»su - myuser -c "/usr/local/scripts/app.sh" 2>&1«

geht zwar in die richtige Richtung, hilft dem OP aber nicht, weil
der sein eigenes crontab und nicht das von »root« verwenden
möchte.
Post by Juergen Ilse
Welche Antworten sollen da "halbgar" sein oder "nur im
Spezialfall funktionieren? OK, eine Antwort, die behauptet hat,
der im Login Environment des Users gesetzte PATH wuerde
ueberschrieben, ist tatsaechlich nicht korrekt gewesen, aber
ansonsten?
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Juergen Ilse
2019-03-04 21:56:18 UTC
Permalink
Hallo,
Post by Helmut Waitzmann
| If you don't know where the command is that you want execute
| which <command> from your shell and it'll tell you the path.
Diese Falschinformation scheint nicht totzukriegen zu sein: Nicht
»which« sondern »command -v -- gesuchtes_Kommando« wäre die
richtige Antwort gewesen.
Welches die "richtige Antwort" in diesem Fall ist, haengt von der shell
ab: csh kennt z.B. kein commando "command", aber "which" ist ein shell-
internes commando. In nahezu allen bourne shell kompatiblen shells liefert
das Kommando "type" die notwendige Information (so viel Verstaendnis, dass
man die Bedeutung von "is a shell builtin" zu interpretieren weiss, sollte
man schon haben ...). Die zsh kennt (im zsh modus) alle Varianten als shell-
interne Kommandos ... Man sollte dann gfs. noch mal in die Doku zu cron
hineinschauen, um sicher zu sein in welcher shell denn cron seine Kommandos
ausfuehrt (wenn man "command -v" in einer bash benutzt, kann das in einem
per cron ausgefuehrten script ganz anders aussehen, wenn man es nicht mittels
"#!/bin/bash" ausdruecklich in der bash ausfuehren laesst ...
Du siehst, auch deine "richtigere" Antwort ist nicht unbedingt unter allen
Umstaenden richtig ...
Die sicherste Methode beim ausfuehren von shell-scripten (egal ob von cron
oder interaktiv ausgefuehrt oder von anderen scripten aus aufgerufen) ist es,
in dem script selbst das benoetigte Environment zu setzen (inclusive PATH),
und zum testen das script ggfs. auch mal mit leerem Environment ("env -")
aufzurufen ...
Post by Helmut Waitzmann
| So once your program is running, the first thing it should do is
| set PATH and any other required variable (e.g. LD_LIBRARY_PATH)
| to the values that are required for the script to run.
»and any other required variable«: Das ist in der Tat ein guter
Rat. Nur, wie denn? Das war die Frage des OP.
"PATH=/usr/bin:/usr/local/bin: ..." (gemaess eigenen Anforderungen
ergaenzzen) sollte eigentlich niemanden ueberfordern, der shell-scripte
schreiben kann (und shell-tutorials gibt es reichlich genug, fuer nahezu
jede shell-Variante ...).
Post by Helmut Waitzmann
| Execute crontab with login option!
|
| CRONTAB run script or command with Environment Variables
|
| 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php'
| 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh
OK, so weit hatte ich die Antworten nicht durchgelesen. Diese Version halte
ich eher fuer eine sehr schlechte idee ...

Man sollte sich ueberlegen, welches Environment man benoetigt und *genau*
*das* setzen (nein, dass ist *nicht* immer das selbe wie das login-
Environment).
Bei allen Vorschlaegen ist der essentuelle Hinweis der Hinweis auf das
Environment des cron-jobs. Ob man dieses nun in einem "shell-wrapper"
um das eigentlich auszufuehrende Kommando oder in der crontab selbst
setzt, ist letztlich gleichgueltig. Und dass das Environment prozess-
spezifisch ist und nur vom parent zum child aber niemals in der Gegen-
richtug direkt vererbt werden kann, hatte ich glaube ich erwaehnt ...

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Helmut Waitzmann
2019-03-05 21:26:25 UTC
Permalink
Post by Juergen Ilse
Post by Helmut Waitzmann
| If you don't know where the command is that you want execute
| which <command> from your shell and it'll tell you the path.
Diese Falschinformation scheint nicht totzukriegen zu sein: Nicht
»which« sondern »command -v -- gesuchtes_Kommando« wäre die
richtige Antwort gewesen.
Welches die "richtige Antwort" in diesem Fall ist, haengt von der shell
ab: csh kennt z.B. kein commando "command", aber "which" ist ein shell-
internes
ein csh‐internes
Post by Juergen Ilse
commando.
Richtig. So lange nirgends die Rede davon ist, dass es sich um
einen nicht POSIX‐kompatiblen Shell handelt, halte ich mich an
POSIX. Dort gibt es seit längerem »command« aber kein »which«.
Und weil sich »csh considered harmful« inzwischen herumgesprochen
haben dürfte, gehe ich zunächst auch davon aus, dass der Anwender
in der Regel keinen Csh in der Benutzerdatenbank stehen haben
wird.
Post by Juergen Ilse
In nahezu allen bourne shell kompatiblen shells liefert das
Kommando "type" die notwendige Information (so viel Verstaendnis,
dass man die Bedeutung von "is a shell builtin" zu interpretieren
weiss, sollte man schon haben ...).
»command« liegt näher am gewünschten.
Post by Juergen Ilse
Die zsh kennt (im zsh modus) alle Varianten als shell-interne
Kommandos ... Man sollte dann gfs. noch mal in die Doku zu cron
hineinschauen, um sicher zu sein in welcher shell denn cron seine
Kommandos ausfuehrt
Das ist festgelegt.
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html>
sagt:

Upon execution of a command from a crontab entry, the
implementation shall supply a default environment, defining at
least the following environment variables:

HOME
A pathname of the user's home directory.
LOGNAME
The user's login name.
PATH
A string representing a search path guaranteed to find all
of the standard utilities.
SHELL
A pathname of the command interpreter. When crontab is
invoked as specified by this volume of POSIX.1-2017, the
value shall be a pathname for sh.

und später:

The text about "invoked as specified by this volume of
POSIX.1-2017" means that the implementation may provide
extensions that allow these variables to be affected at runtime,
but that the user has to take explicit action in order to access
the extension, such as give a new option flag or modify the
format of the crontab entry.

Wenn der Anwender also nichts daran ändert, ist es der
POSIX‐kompatible Shell.
Post by Juergen Ilse
(wenn man "command -v" in einer bash benutzt, kann das in einem
per cron ausgefuehrten script ganz anders aussehen, wenn man es
nicht mittels "#!/bin/bash" ausdruecklich in der bash ausfuehren
laesst ... Du siehst, auch deine "richtigere" Antwort ist nicht
unbedingt unter allen Umstaenden richtig ...
Genau. Drum lässt man das Kommandoraten mit »which«, »type« oder
»command« am besten bleiben und sorgt dafür, dass das ins Crontab
geschriebene Kommando eine ordentliche Umgebung aufbaut:
beispielsweise mit einem Login‐Shell.
Post by Juergen Ilse
Die sicherste Methode beim ausfuehren von shell-scripten (egal ob
von cron oder interaktiv ausgefuehrt oder von anderen scripten
aus aufgerufen) ist es, in dem script selbst das benoetigte
Environment zu setzen (inclusive PATH),
Ich wiederhole es gerne noch einmal: Wer die benötigten
Umgebungsvariablen als Anwender selber setzen will, muss die
Arbeit, die bei Login‐Shells der Administrator bereits getan hat,
selber machen. Das bedeutet, dass er strenggenommen vor jedem
Start solch eines Skriptes beim Administrator nachfragen muss, ob
der vielleicht inzwischen irgend etwas an der Konfiguration
geändert hat. Wenn der Anwender gleichzeitig der Administrator
ist, geht das extra Nachfragen zwar einfacher, getan werden muss
es aber trotzdem. In beiden Fällen ist das eine weitere
Möglichkeit, etwas zu vergessen und Fehler zu machen.
Post by Juergen Ilse
und zum testen das script ggfs. auch mal mit leerem Environment
("env -") aufzurufen ...
Exploits findet man damit nicht – man erzeugt sie womöglich erst.
Post by Juergen Ilse
Post by Helmut Waitzmann
| So once your program is running, the first thing it should do is
| set PATH and any other required variable (e.g. LD_LIBRARY_PATH)
| to the values that are required for the script to run.
»and any other required variable«: Das ist in der Tat ein guter
Rat. Nur, wie denn? Das war die Frage des OP.
"PATH=/usr/bin:/usr/local/bin: ..." (gemaess eigenen Anforderungen
ergaenzzen) sollte eigentlich niemanden ueberfordern, der shell-scripte
schreiben kann (und shell-tutorials gibt es reichlich genug, fuer nahezu
jede shell-Variante ...).
Du hast das vergessen, was der Systemadministrator vor die »...«
noch hinzugefügt hat (s. o.), und »LD_LIBRARY_PATH« und weitere
Umgebungsvariable, die im Augenblick weder Dir noch mir einfallen,
auch.
Post by Juergen Ilse
Post by Helmut Waitzmann
| Execute crontab with login option!
|
| CRONTAB run script or command with Environment Variables
|
| 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php'
| 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh
OK, so weit hatte ich die Antworten nicht durchgelesen.
Aha. Aber vorwerfen kannst Du dem OP, dass er Stackoverflow nicht
gefunden geschweige denn gelesen hat.
Post by Juergen Ilse
Diese Version halte ich eher fuer eine sehr schlechte idee ...
Man sollte sich ueberlegen, welches Environment man benoetigt und *genau*
*das* setzen
Na, dann viel Spaß dabei, alle Kommandos im Shell‐Skript
abzuklappern: bei jedem das Handbuch zu lesen und nachzusehen,
welche Umgebungsvariablen eine Rolle spielen, dazu dasselbe auch
für den Shell selbst zu tun und dabei zu überlegen, welche
Kommandos von diesen Kommandos vielleicht noch aufgerufen werden
könnten, ohne, dass man es ihnen gleich ansieht, und dann immer
noch im Auge zu behalten, was der Systemadministrator konfiguriert
hat.
Post by Juergen Ilse
(nein, dass ist *nicht* immer das selbe wie das login-
Environment).
Da würde ich gerne ein Beispiel sehen. Ich bin bisher gut damit
gefahren, vom ins Crontab eingetragenen Kommando einen
(nicht‐interaktiven) Login‐Shell zu starten und den die Nutzlast
ausführen zu lassen.
Post by Juergen Ilse
Bei allen Vorschlaegen ist der essentuelle Hinweis der Hinweis
auf das Environment des cron-jobs.
Das – hoffe ich doch – ist mit den Hinweisen auf den Unterschied
zwischen Einloggen am Terminal und einem Cronjob zur Sprache
gekommen.
Post by Juergen Ilse
Ob man dieses nun in einem "shell-wrapper" um das eigentlich
auszufuehrende Kommando oder in der crontab selbst setzt, ist
letztlich gleichgueltig.
Im Prinzip ja. Ich bevorzuge einen vom Crontab gestarteten
Login‐Shell als Wrapper.
Post by Juergen Ilse
Und dass das Environment prozess-spezifisch ist und nur vom
parent zum child aber niemals in der Gegenrichtug direkt
vererbt werden kann, hatte ich glaube ich erwaehnt ...
Im diesem letzten Satz sind wir uns einig. Nur ziehe ich halt bei
den Vorschlägen von Stackoverflow, wie das zu bewerkstelligen
wäre, die Augenbrauen hoch.

Und natürlich geht es mir darum, Deinem Vorwurf – jetzt mal
schnoddrig ausgedrückt; Du warst höflicher – »Du bist wohl zu
faul/dumm oder was auch immer, eine Suchmaschine zu bedienen«
etwas entgegenzusetzen, wenn das, was die Suchmaschine ausspuckt,
zu wünschen übrig lässt.
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Juergen Ilse
2019-03-06 09:07:10 UTC
Permalink
Hallo,
Post by Helmut Waitzmann
Genau. Drum lässt man das Kommandoraten mit »which«, »type« oder
»command« am besten bleiben und sorgt dafür, dass das ins Crontab
beispielsweise mit einem Login‐Shell.
Nein, indem man das benoetigte Environment explizit setzt. Ansonsten kann
eine unbedachte Aenderung in ${HOME}/.profile das Verhalten von cron-jobs
aendern, was eher sehr ueberraschend waere ... Solche ueberraschendes Ver-
halten sollte man tunlichst vermeiden.
Post by Helmut Waitzmann
Post by Juergen Ilse
Die sicherste Methode beim ausfuehren von shell-scripten (egal ob
von cron oder interaktiv ausgefuehrt oder von anderen scripten
aus aufgerufen) ist es, in dem script selbst das benoetigte
Environment zu setzen (inclusive PATH),
Ich wiederhole es gerne noch einmal: Wer die benötigten
Umgebungsvariablen als Anwender selber setzen will, muss die
Arbeit, die bei Login‐Shells der Administrator bereits getan hat,
selber machen.
Ja. Aber das ist gewollt, da´man beim Verhalten eines cron-jobs nicht
von einem ggfs. nicht von einem ggfs.nicht selbst gesetzten Environment
abhaengig haben moechte ...
Post by Helmut Waitzmann
Das bedeutet, dass er strenggenommen vor jedem Start solch eines Skriptes
beim Administrator nachfragen muss, ob der vielleicht inzwischen irgend
etwas an der Konfiguration geändert hat.
Warum sollte er dass muessen? Genau das Gegenteil ist der Fall. Ein vom
Admin geaendertes /etc/profile kann bei "selbst gesetztem Environment"
keinen Einfluss auf den cron-job haben, und genau das ist es, was man
anstreben sollte. Nur wenn man das Environment selbst setzt, ist man unab-
haengig von ggfs. unangekuendigten Aenderungen vom Admin.
Post by Helmut Waitzmann
Post by Juergen Ilse
und zum testen das script ggfs. auch mal mit leerem Environment
("env -") aufzurufen ...
Exploits findet man damit nicht?– man erzeugt sie womöglich erst.
???
Post by Helmut Waitzmann
Post by Juergen Ilse
Post by Helmut Waitzmann
| So once your program is running, the first thing it should do is
| set PATH and any other required variable (e.g. LD_LIBRARY_PATH)
| to the values that are required for the script to run.
»and any other required variable«: Das ist in der Tat ein guter
Rat. Nur, wie denn? Das war die Frage des OP.
Nein, die Frage des OP war, warum bei ihm ein per cron aufgerufenes script
ggfs. anderes Verhalten aufweist als ein von ihm interaktiv aufgerufenes
script. Unbd da lautet die Antwort: wegen unterschiedlichem Environment.
Wenn man ein shellscript sicher machen will, sollte es fuer die Ausfuehrug
relevante Environment-Variablen *selbst* setzen (insbesondere, um nicht
ggfs. unter unterschiedlichen Accounts unterschiedlich zu laufen).
Und wenn man schon fuer andere shell-scripte das manuelle setzen des Envi-
ronments empfiehlt (aus gutem Grund), dann gibt es keinerlei Grund, aus-
gerechnet bei cron-jobs von dieser Empfehlung abzuweichen.
Post by Helmut Waitzmann
Post by Juergen Ilse
Diese Version halte ich eher fuer eine sehr schlechte idee ...
Man sollte sich ueberlegen, welches Environment man benoetigt und *genau*
*das* setzen
Na, dann viel Spaß dabei, alle Kommandos im Shell‐Skript
abzuklappern: bei jedem das Handbuch zu lesen und nachzusehen,
welche Umgebungsvariablen eine Rolle spielen, dazu dasselbe auch
für den Shell selbst zu tun und dabei zu überlegen, welche
Kommandos von diesen Kommandos vielleicht noch aufgerufen werden
könnten, ohne, dass man es ihnen gleich ansieht, und dann immer
noch im Auge zu behalten, was der Systemadministrator konfiguriert
hat.
Aus diesem Grund der Tip, das script vor der Installation als cron-job
auch mal mit "leerem" Environment auszufuehren, um ggfs. fehlende Variablen
aufzuspueren.
Post by Helmut Waitzmann
Post by Juergen Ilse
Bei allen Vorschlaegen ist der essentuelle Hinweis der Hinweis
auf das Environment des cron-jobs.
Das?– hoffe ich doch?– ist mit den Hinweisen auf den Unterschied
zwischen Einloggen am Terminal und einem Cronjob zur Sprache
gekommen.
... was aber nichts daran aendert, dass man *reproduzierbares* Verhalten
moechte, und das kann man letztendlich nur gewaehrleisten, wenn man das
relevante Environment *selbst* setzt.

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Helmut Waitzmann
2019-03-06 21:34:22 UTC
Permalink
Post by Juergen Ilse
Post by Helmut Waitzmann
Genau. Drum lässt man das Kommandoraten mit »which«, »type« oder
»command« am besten bleiben und sorgt dafür, dass das ins Crontab
beispielsweise mit einem Login‐Shell.
Nein, indem man das benoetigte Environment explizit setzt. Ansonsten kann
eine unbedachte Aenderung in ${HOME}/.profile das Verhalten von cron-jobs
aendern, was eher sehr ueberraschend waere ... Solche ueberraschendes Ver-
halten sollte man tunlichst vermeiden.
An der Datei »"${HOME%/}"/.profile« sollte man überhaupt nichts
unbedacht[1] ändern, denn sie ist /die/ Konfigurationsdatei, an
der der Anwender seine Login‐Umgebung konfiguriert. Das würde
nicht nur bei nicht‐interaktiven Login‐Shells, die man in Crontabs
startet, Ärger machen, sondern bei jedem Login, sei es interaktiv
an der Konsole oder – je nach System – auch nicht‐interaktiv am
grafischen Zugang.

[1] Auch dafür ist Stackoverflow »gut«: Im von Dir angeführten
<https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths>
steht ein Verweis auf
<http://stackoverflow.com/q/15557777/1025391>: »Cron job does NOT
get the environment variables set in .bashrc«. Es stellt sich
dann heraus: Die fragliche Zuweisung an die gewünschte Variable
wird wegen

#If not running interactively, don't do anything
[ -z "$PS1" ] && return

am Anfang der Datei nicht ausgeführt, wenn der Shell
nicht‐interaktiv ist. Und der in
<https://stackoverflow.com/questions/15557777/cron-job-does-not-get-the-environment-variables-set-in-bashrc#answer-15574078>
gegebene Rat lautet: »comment out the line that checks for
presence of the PS1 variable« […] »this will make bash execute the
entire contents of« [the file].

Da greift man sich an den Kopf! Kein Wort davon, dass es
vielleicht sinnvoll wäre, zu schauen, welche Kommandos in der
Datei denn nun geeignet sind, sowohl von interaktiven als auch von
nicht‐interaktiven Shells ausgeführt zu werden, und welche nur von
interaktiven Shells ausgeführt werden sollten!

Das ist wirklich unbedachtes Herumfummeln.

Vermutung: Die Einschränkung der Kommandos auf interaktive Shells
kam vom Distributor. Und da glaubst Du, ein Anwender, der es
nicht rafft, mit Bedacht Änderungen vorzunehmen, ist in der Lage,
seine Crontab‐Umgebung selbst zusammenzustellen?
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
Die sicherste Methode beim ausfuehren von shell-scripten (egal ob
von cron oder interaktiv ausgefuehrt oder von anderen scripten
aus aufgerufen) ist es, in dem script selbst das benoetigte
Environment zu setzen (inclusive PATH),
Ich wiederhole es gerne noch einmal: Wer die benötigten
Umgebungsvariablen als Anwender selber setzen will, muss die
Arbeit, die bei Login‐Shells der Administrator bereits getan hat,
selber machen.
Ja. Aber das ist gewollt, da´man beim Verhalten eines cron-jobs nicht
von einem ggfs. nicht von einem ggfs.nicht selbst gesetzten Environment
abhaengig haben moechte ...
Man kann selbst als bedachtsamer Anwender nicht wissen, ob der
Administrator beispielsweise »/usr/xpg4/bin/« in den PATH stellen
muss, damit sein System POSIX‐kompatibel ist. Das weiß nur der
Administrator. Trotzdem möchte man als Anwender
POSIX‐Kompatibilität haben.
Post by Juergen Ilse
Post by Helmut Waitzmann
Das bedeutet, dass er strenggenommen vor jedem Start solch eines Skriptes
beim Administrator nachfragen muss, ob der vielleicht inzwischen irgend
etwas an der Konfiguration geändert hat.
Warum sollte er dass muessen? Genau das Gegenteil ist der Fall. Ein vom
Admin geaendertes /etc/profile kann bei "selbst gesetztem Environment"
keinen Einfluss auf den cron-job haben, und genau das ist es, was man
anstreben sollte. Nur wenn man das Environment selbst setzt, ist man unab-
haengig von ggfs. unangekuendigten Aenderungen vom Admin.
… und fällt auf die Schnauze, wenn so eine Änderung bewirkt, dass
die vom Anwender selbst erstellte Crontab‐Umgebung plötzlich ein
nicht mehr POSIX‐kompatibels System bewirkt.

Der Administrator ist dafür verantwortlich, ein POSIX‐kompatibles
System auf die Beine zu stellen. Darin, wie er das
bewerkstelligt, ist er frei. Dazu gehört, dass er die benötigten
Utilities installiert und den PATH so wählt, dass sie gefunden
werden. Welche Verzeichnisse er dabei in welcher Reihenfolge den
PATH stellt, ist nicht von vorne herein festgelegt.

Du hast vielleicht die folgende Erfahrung nicht gemacht: Ich
hatte schon mit heterogenen Umgebungen zu tun: Dasselbe
HOME‐Verzeichnis wird dem Anwender sowohl von HPUX als auch
Solaris auf verschiedenen Maschinen per NFS zur Verfügung
gestellt. Und natürlich hatte jedes Betriebssystem seine eigene
Belegung der Variablen »PATH«. Da ist der Anwender froh, wenn
er nicht selber raten muss, was wohl in den PATH hinein muss,
sondern einfach per Login‐Shell wissen kann: So, wie der
Administrator den PATH auf diesem System für Login‐Shells
konfiguriert hat, ist er richtig.
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
und zum testen das script ggfs. auch mal mit leerem Environment
("env -") aufzurufen ...
Exploits findet man damit nicht?– man erzeugt sie womöglich erst.
???
Ich meine mich zu erinnern, dass mir schon Programme (weiß nicht
mehr, welche) unter die Finger gekommen sind, die eine
Konfigurationsdatei im Verzeichnis (in Shell‐Syntax)

»"${HOME:-.}"/«

verwenden. Wenn nun die Variable »HOME« wegen »env -« nicht
definiert ist…
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
Post by Helmut Waitzmann
| So once your program is running, the first thing it should do is
| set PATH and any other required variable (e.g. LD_LIBRARY_PATH)
| to the values that are required for the script to run.
»and any other required variable«: Das ist in der Tat ein guter
Rat. Nur, wie denn? Das war die Frage des OP.
Nein, die Frage des OP war, warum bei ihm ein per cron aufgerufenes script
ggfs. anderes Verhalten aufweist als ein von ihm interaktiv aufgerufenes
script. Unbd da lautet die Antwort: wegen unterschiedlichem Environment.
Genau. Und da gehört gegebenenfalls auch »LD_LIBRARY_PATH« dazu.

Und du glaubst, dass der Fragesteller in
<https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths>
»LD_LIBRARY_PATH« bereits im Griff hatte, obwohl er mit »PATH«
Ärger hatte?
Post by Juergen Ilse
Wenn man ein shellscript sicher machen will, sollte es fuer die Ausfuehrug
relevante Environment-Variablen *selbst* setzen (insbesondere, um nicht
ggfs. unter unterschiedlichen Accounts unterschiedlich zu laufen).
Unterschiedliche Accounts? Ausgangspunkt der Fragen – sowohl hier
im Usenet als auch bei Stackoverflow – war ein Anwender, der sein
eigenes Crontab benutzen wollte. Das benutzt er nur mit seinem
eigenen Account. Und wenn er sich ein Wrapper‐Skript schreibt,
ist das auch sein eigenes. Jeder andere ist gut beraten, dieses
Skript nicht zu benutzen, sondern sein eigenes zu erstellen.
Post by Juergen Ilse
Und wenn man schon fuer andere shell-scripte das manuelle setzen des Envi-
ronments empfiehlt (aus gutem Grund), dann gibt es keinerlei Grund, aus-
gerechnet bei cron-jobs von dieser Empfehlung abzuweichen.
Post by Helmut Waitzmann
Post by Juergen Ilse
Diese Version halte ich eher fuer eine sehr schlechte idee ...
Man sollte sich ueberlegen, welches Environment man benoetigt und *genau*
*das* setzen
Na, dann viel Spaß dabei, alle Kommandos im Shell‐Skript
abzuklappern: bei jedem das Handbuch zu lesen und nachzusehen,
welche Umgebungsvariablen eine Rolle spielen, dazu dasselbe auch
für den Shell selbst zu tun und dabei zu überlegen, welche
Kommandos von diesen Kommandos vielleicht noch aufgerufen werden
könnten, ohne, dass man es ihnen gleich ansieht, und dann immer
noch im Auge zu behalten, was der Systemadministrator konfiguriert
hat.
Aus diesem Grund der Tip, das script vor der Installation als cron-job
auch mal mit "leerem" Environment auszufuehren, um ggfs. fehlende Variablen
aufzuspueren.
Das funktioniert nicht, sondern reißt womöglich Exploits auf
(s. o.).
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
Bei allen Vorschlaegen ist der essentuelle Hinweis der Hinweis
auf das Environment des cron-jobs.
Das?– hoffe ich doch?– ist mit den Hinweisen auf den Unterschied
zwischen Einloggen am Terminal und einem Cronjob zur Sprache
gekommen.
... was aber nichts daran aendert, dass man *reproduzierbares* Verhalten
moechte, und das kann man letztendlich nur gewaehrleisten, wenn man das
relevante Environment *selbst* setzt.
Das war in der oben erwähnten heterogenen Umgebung mit dem von
verschiedenen Betriebssystemen NFS‐montierten gemeinsamen
Home‐Verzeichnis nicht zu machen, ohne auf eine vom Administrator
gewartete Umgebung zurückzugreifen.
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Juergen Ilse
2019-03-07 08:00:58 UTC
Permalink
Hallo,
Post by Helmut Waitzmann
Post by Juergen Ilse
Post by Helmut Waitzmann
Genau. Drum lässt man das Kommandoraten mit »which«, »type« oder
»command« am besten bleiben und sorgt dafür, dass das ins Crontab
beispielsweise mit einem Login‐Shell.
Nein, indem man das benoetigte Environment explizit setzt. Ansonsten kann
eine unbedachte Aenderung in ${HOME}/.profile das Verhalten von cron-jobs
aendern, was eher sehr ueberraschend waere ... Solche ueberraschendes Ver-
halten sollte man tunlichst vermeiden.
An der Datei »"${HOME%/}"/.profile« sollte man überhaupt nichts
unbedacht[1] ändern, denn sie ist /die/ Konfigurationsdatei, an
der der Anwender seine Login‐Umgebung konfiguriert.
Korrekt: seine *LOGIN* Umgebung. Und eine Login-shell ist i.d.R. interaktiv,
die shell, in der ein cron-job ausgefuehrt wird aber i.d.R. nicht. Die inter-
aktive Login-shell hat ein "controlling terminal", die shell in der der cron-
job ausgefuehrt wird dagegen nicht. All das sind (gerade fuer den nicht so
stark in den Feinheiten drin steckenden User) potentielle Stolperfallen, die
zu Problemen fuehren koennten (weil der User, der seine .profile aendert,
ggfs. die wesentlichen Unterschiede nicht alle in Betracht gezogen hat).
Auch ist es "ueberraschend" und nicht unbedingt zu erwarten, dass sich
Aenderungen in ${HOME}/.profile auf das Verhalten von cron-jobs auswirken.
Daher sollte man da nichts vermischen, was nicht zusammengehoert.
Post by Helmut Waitzmann
Das würde nicht nur bei nicht‐interaktiven Login‐Shells, die man in
Crontabs startet, Ärger machen,
Deswegen tut man das auch nicht.
Post by Helmut Waitzmann
sondern bei jedem Login, sei es interaktiv an der Konsole oder?
Deswegen testet man seine Anpassungen an der Datei auch, bevor man sie
als permanente Aenderung im System belaesst. Und diese Datei gehoert aus
gutem Grund dem jeweiligen User und nicht dem Admin: damit der User seine
Login-Umgebung an seine Beduerfnisse anpassen kann. Diese Datei ist dazu
da, dass man sie als User aendern kann. Sie ist aber nicht dazu da, auch
das Environment fuer alle anderen jobs des Users (z.B. cron-jobs) bereit-
zustellen.
Post by Helmut Waitzmann
– je nach System?– auch nicht‐interaktiv am grafischen Zugang.
Ausserdem ist u.U. noch nicht einmal damit wirklich gewaehrleistet,
dass die cron-jobs genauso laufen wie in der interaktiven shell. Eine
bash fuehrt in jeder interaktiven shell auch noch ${HOME}/.bashrc
aus, was in der shell in der der cron-job ausgefuehrt wird *nicht*
der Fall waere (bei ksh haengt das vom Inhalt der Environment-Variable
"ENV" ab), so dass in .bashrc gesetzte aliases oder shellfunktionen im
cron-job nicht zur Verfuegung stehen.
Post by Helmut Waitzmann
[1] Auch dafür ist Stackoverflow »gut«: Im von Dir angeführten
<https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths>
steht ein Verweis auf
<http://stackoverflow.com/q/15557777/1025391>: »Cron job does NOT
get the environment variables set in .bashrc«. Es stellt sich
dann heraus: Die fragliche Zuweisung an die gewünschte Variable
wird wegen
#If not running interactively, don't do anything
[ -z "$PS1" ] && return
am Anfang der Datei nicht ausgeführt, wenn der Shell
nicht‐interaktiv ist.
Standardmaessig wird die .bashrc in nicht interaktiven shells auch nicht
ausgefuehrt. Leider sind einige Distributionen dazu uebergegangen, die
.bashrc auch von anderen Dateien "sourcen" zu lassen und damit die eigent-
lich vorgesehenen Differenzierungen in der bash ausser Kraft zu setzen ...
Post by Helmut Waitzmann
Da greift man sich an den Kopf! Kein Wort davon, dass es
vielleicht sinnvoll wäre, zu schauen, welche Kommandos in der
Datei denn nun geeignet sind, sowohl von interaktiven als auch von
nicht‐interaktiven Shells ausgeführt zu werden, und welche nur von
interaktiven Shells ausgeführt werden sollten!
Genau deshalb ist es in der bash vorgesehen, dass .bashrc in interaktiven
shells (und nur in diesen) ausgefuehrt wird. Ich habe mich zu Zeiten der
"S.u.S.E 4.2" Distribution mit den SUSE Entwicklern herumgestritten, aber
die Diskussion ist leider ergebnislos im Sande verlaufen und SUSE hatte
die eigentlich so nicht vorgesehene Konfiguration (".bashrc" wird, zu-
mindest manchmal, auch von ".profile" gelesen), Andere Distributionen
haben sich seitdem leider an diesen Unfug angepasst.
Post by Helmut Waitzmann
Vermutung: Die Einschränkung der Kommandos auf interaktive Shells
kam vom Distributor.
... und zwar als workaround fuer den Unfug, .profile und .bashrc sich
gegenseitig einlesen zu lassen. Bei SUSE spielt da vermutlich auch noch
eine Variable "PROFILE_READ" oder so aehnlich eine Rolle, da sonst der
vom Distributor eingebaute workaround fuer ein vom Distributor verur-
sachte Problem nicht fubnktionieren wuerde ...
Post by Helmut Waitzmann
Und da glaubst Du, ein Anwender, der es nicht rafft, mit Bedacht
Änderungen vorzunehmen, ist in der Lage, seine Crontab‐Umgebung selbst
zusammenzustellen?
Das sollte er koennen (oder von cron die Finger lassen).
Post by Helmut Waitzmann
Post by Juergen Ilse
Ja. Aber das ist gewollt, da´man beim Verhalten eines cron-jobs nicht
von einem ggfs. nicht von einem ggfs.nicht selbst gesetzten Environment
abhaengig haben moechte ...
Man kann selbst als bedachtsamer Anwender nicht wissen, ob der
Administrator beispielsweise »/usr/xpg4/bin/« in den PATH stellen
muss, damit sein System POSIX‐kompatibel ist. Das weiß nur der
Administrator. Trotzdem möchte man als Anwender
POSIX‐Kompatibilität haben.
Wenn man dem vom Admin vorgesetzten PATH vertraut, aber dennoch eigene
Aenderungen einbringen will, hat sich "PATH=/home/myuser/bin:${PATH}"
oder dergleichen bewaehrt.
Post by Helmut Waitzmann
Post by Juergen Ilse
Warum sollte er dass muessen? Genau das Gegenteil ist der Fall. Ein vom
Admin geaendertes /etc/profile kann bei "selbst gesetztem Environment"
keinen Einfluss auf den cron-job haben, und genau das ist es, was man
anstreben sollte. Nur wenn man das Environment selbst setzt, ist man unab-
haengig von ggfs. unangekuendigten Aenderungen vom Admin.
… und fällt auf die Schnauze, wenn so eine Änderung bewirkt, dass
die vom Anwender selbst erstellte Crontab‐Umgebung plötzlich ein
nicht mehr POSIX‐kompatibels System bewirkt.
Deine Argumentation ist doch Unfug. Wie oft hast du es denn schon erlebt,
dass eine vom Admin durchgefuehrte Aenderung einen vormals lauffaehingen
cron-job, der sein eigenes Environment setzt, nicht mehr lauffaehig war?
Post by Helmut Waitzmann
Du hast vielleicht die folgende Erfahrung nicht gemacht: Ich
hatte schon mit heterogenen Umgebungen zu tun: Dasselbe
HOME‐Verzeichnis wird dem Anwender sowohl von HPUX als auch
Solaris auf verschiedenen Maschinen per NFS zur Verfügung
gestellt. Und natürlich hatte jedes Betriebssystem seine eigene
Belegung der Variablen »PATH«.
... und da erweitert der Anwender das vom Admin bereitgestellte
Environment statt es zu ueberschreiben. Das ist voellig normal.
Post by Helmut Waitzmann
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
und zum testen das script ggfs. auch mal mit leerem Environment
("env -") aufzurufen ...
Exploits findet man damit nicht?– man erzeugt sie womöglich erst.
???
Ich meine mich zu erinnern, dass mir schon Programme (weiß nicht
mehr, welche) unter die Finger gekommen sind, die eine
Konfigurationsdatei im Verzeichnis (in Shell‐Syntax)
»"${HOME:-.}"/«
verwenden. Wenn nun die Variable »HOME« wegen »env -« nicht
definiert ist…
Das stellt man dann aber beim testen fest, und kann den Aufruf fuer
den Test auf "env - HOME=... ..." aendern.
Post by Helmut Waitzmann
Post by Juergen Ilse
... was aber nichts daran aendert, dass man *reproduzierbares* Verhalten
moechte, und das kann man letztendlich nur gewaehrleisten, wenn man das
relevante Environment *selbst* setzt.
Das war in der oben erwähnten heterogenen Umgebung mit dem von
verschiedenen Betriebssystemen NFS‐montierten gemeinsamen
Home‐Verzeichnis nicht zu machen, ohne auf eine vom Administrator
gewartete Umgebung zurückzugreifen.
Das ist Unsinn. Wenn man dort in einer Umgebung einen cron-job installiert,
wird der selbe cron-job nicht automatisch auf allen Systemen installiert.
Man kann cron-jobs fuer jedes System unabhaengig installieren, da die
User-crontab-Eintraege nicht unterhalb von $HOME liegen (bei *keinem*
System).

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Helmut Waitzmann
2019-03-08 11:50:58 UTC
Permalink
Post by Juergen Ilse
Post by Helmut Waitzmann
An der Datei »"${HOME%/}"/.profile« sollte man überhaupt nichts
unbedacht[1] ändern, denn sie ist /die/ Konfigurationsdatei, an
der der Anwender seine Login‐Umgebung konfiguriert.
Korrekt: seine *LOGIN* Umgebung. Und eine Login-shell ist i.d.R. interaktiv,
die shell, in der ein cron-job ausgefuehrt wird aber i.d.R. nicht.
Ein Login‐Shell ist keinesfalls immer interaktiv. Neben »login«,
das interaktive Shells startet, gibt es auch noch

»su [su-options...] -- - user Shell-Parameters...«,

Logins in grafische Umgebungen, die einen nicht‐interaktiven
Login‐Shell starten, oder eben auch das Bash‐»exec«‐Kommando mit
der Option »-l«.
Post by Juergen Ilse
Die interaktive Login-shell
hat ein "controlling terminal", die
shell in der der cron-job ausgefuehrt wird dagegen nicht.
Und die Login‐Shells, die auf eine der oben angedeuteten Weisen
gestartet werden, haben auch kein controlling terminal. Das
bedeutet beispielsweise: Wer unbedacht an »"${HOME%/}"/.profile«
Änderungen vornimmt, riskiert, sich nicht mehr grafisch einloggen
zu können, und, wenn's ganz dumm läuft, auch nicht mehr an der
Konsole.
Post by Juergen Ilse
All das sind (gerade fuer den nicht so stark in den Feinheiten
drin steckenden User) potentielle Stolperfallen, die zu Problemen
fuehren koennten (weil der User, der seine .profile aendert,
ggfs. die wesentlichen Unterschiede nicht alle in Betracht
gezogen hat).
Ja. Deshalb wäre wirklich jeder Anwender, der seine
Konfigurationsdateien ändern will, gut beraten, sich mit Unix
auszukennen. Und damit ich ausdrücklich nicht nur den Shell: Das
Shell‐Handbuch ist nur für Leser verständlich, die die Grundzüge
von Unix verstehen.
Post by Juergen Ilse
Auch ist es "ueberraschend" und nicht unbedingt zu erwarten, dass
sich Aenderungen in ${HOME}/.profile auf das Verhalten von
cron-jobs auswirken. Daher sollte man da nichts vermischen, was
nicht zusammengehoert.
Ja. Es ist in etwa so überraschend, wie sich Änderungen auf das
Login am grafischen Anmeldezugang auswirken.
Post by Juergen Ilse
Post by Helmut Waitzmann
Das würde nicht nur bei nicht‐interaktiven Login‐Shells, die man in
Crontabs startet, Ärger machen,
Deswegen tut man das auch nicht.
Post by Helmut Waitzmann
sondern bei jedem Login, sei es interaktiv an der Konsole oder?
Deswegen testet man seine Anpassungen an der Datei auch, bevor man sie
als permanente Aenderung im System belaesst.
Vor allen Dingen sollte man nicht nur testen, sondern das Handbuch
lesen und nachdenken.
Post by Juergen Ilse
Und diese Datei gehoert aus gutem Grund dem jeweiligen User und
nicht dem Admin: damit der User seine Login-Umgebung an seine
Beduerfnisse anpassen kann. Diese Datei ist dazu da, dass man sie
als User aendern kann.
Exakt.
Post by Juergen Ilse
Sie ist aber nicht dazu da, auch das Environment fuer alle
anderen jobs des Users (z.B. cron-jobs) bereit- zustellen.
Das denkst Du Dir aus. Als prominentes Gegenbeispiel ist mir der
grafische Login‐Zugang begegnet.
Post by Juergen Ilse
Post by Helmut Waitzmann
– je nach System?– auch nicht‐interaktiv am grafischen Zugang.
Ausserdem ist u.U. noch nicht einmal damit wirklich gewaehrleistet,
dass die cron-jobs genauso laufen wie in der interaktiven shell.
Exakt dasselbe gilt für den grafischen Login‐Zugang.

Cron‐Jobs werden sich allein bereits dadurch unterscheiden, dass
sie kein controlling terminal haben. Da muss man die Lage nicht
noch dadurch verkomplizieren, dass man ihnen einen
nicht‐interaktiven Login‐Shell vorenthält.
Post by Juergen Ilse
Eine bash fuehrt in jeder interaktiven shell auch noch
${HOME}/.bashrc aus,
Nein. Login‐Bashs tun das nicht – egal, ob sie interaktiv sind
oder nicht.

Allerdings kann man es hinbekommen, indem man in »~/.bash_profile«

case "$-" in
*i*)
# Die folgenden Kommandos werden nur von einem
# interaktiven Login-Bash ausgefuehrt:
#
# Interaktive Login-Bashs sollen auch
# ~/.bashrc abarbeiten:
#
if test -f ~/.bashrc
then
. ~/.bashrc
fi
;;
*)
# Die folgenden Kommandos werden nur von einem
# nicht-interaktiven Login-Bash ausgefuehrt:
#
;;
esac

reinschreibt.

Das Bash‐Handbuch macht den Vorschlag, in »~/.bash_profile« etwa

if test -f ~/.bashrc
then
. ~/.bashrc
fi

reinzuschreiben. Dann ist es sinnvoll, in »~/.bashrc« zwischen
interaktiven und nicht‐interaktiven Shells zu unterscheiden:

case "$-" in
*i*)
# Die folgenden Kommandos werden nur von einem
# interaktiven Bash ausgefuehrt:
#
;;
*)
# Die folgenden Kommandos werden nur von einem
# nicht-interaktiven Bash ausgefuehrt. Hier empfiehlt es
# sich, nur nach sorgfaeltigster Ueberlegung etwas
# einzutragen, weil nicht-interaktive Shells in der Regel
# Shell-Skripte abarbeiten, und zwar auch solche, die nicht
# vom Aufrufer erstellt wurden:
#
;;
esac

Alle Alias‐ und Funktionsdefinitionen und Variablenbelegungen, die
man nur in interaktiven Shells haben will, kommen dann in den
»interaktiven« Zweig. Dann hat man sie sowohl in interaktiven
Login‐Shells (etwa an der Konsole) als auch in interaktiven
Nicht‐Login‐Shells (etwa im Xterm) zur Verfügung.

Alle Alias‐ und Funktionsdefinitionen, die man nur im
nicht‐interaktiven Fall haben will, kommen in den
»nicht‐interaktiven« Zweig.

Alle Definitionen, die man immer haben will, kommen außerhalb des
»case«‐Kommandos hin.

Definitionen für nicht‐interaktive Shells werden aber eher wenige
sein, weil Shell‐Skripte im Allgemeinen davon ausgehen, eine
POSIX‐Standard‐Umgebung zu haben.
Post by Juergen Ilse
Eine bash fuehrt in jeder interaktiven shell auch noch
${HOME}/.bashrc aus, was in der shell in der der cron-job
ausgefuehrt wird *nicht* der Fall waere (bei ksh haengt das vom
Inhalt der Environment-Variable "ENV" ab), so dass in .bashrc
gesetzte aliases oder shellfunktionen im cron-job nicht zur
Verfuegung stehen.
Ja. Sie stehen nicht zur Verfügung, es sei denn, man sorgt extra
dafür. Und ich empfehle, sehr behutsam dabei vorzugehen,
nicht‐interaktiven Shells selbstausgewählte Aliases oder
Shell‐Funktionen zu verpassen.
Post by Juergen Ilse
Post by Helmut Waitzmann
[1] Auch dafür ist Stackoverflow »gut«: Im von Dir angeführten
<https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-the-correct-paths>
steht ein Verweis auf
<http://stackoverflow.com/q/15557777/1025391>: »Cron job does NOT
get the environment variables set in .bashrc«. Es stellt sich
dann heraus: Die fragliche Zuweisung an die gewünschte Variable
wird wegen
#If not running interactively, don't do anything
[ -z "$PS1" ] && return
am Anfang der Datei nicht ausgeführt, wenn der Shell
nicht‐interaktiv ist.
Standardmaessig wird die .bashrc in nicht interaktiven shells auch nicht
ausgefuehrt. Leider sind einige Distributionen dazu uebergegangen, die
.bashrc auch von anderen Dateien "sourcen" zu lassen und damit die eigent-
lich vorgesehenen Differenzierungen in der bash ausser Kraft zu setzen ...
Post by Helmut Waitzmann
Da greift man sich an den Kopf! Kein Wort davon, dass es
vielleicht sinnvoll wäre, zu schauen, welche Kommandos in der
Datei denn nun geeignet sind, sowohl von interaktiven als auch von
nicht‐interaktiven Shells ausgeführt zu werden, und welche nur von
interaktiven Shells ausgeführt werden sollten!
Genau deshalb ist es in der bash vorgesehen, dass .bashrc in interaktiven
shells (und nur in diesen) ausgefuehrt wird.
Nein, das ist es nicht. Aber weil Du das noch immer nicht
verstanden hast, ist auch
Post by Juergen Ilse
Ich habe mich zu Zeiten der "S.u.S.E 4.2" Distribution mit den
SUSE Entwicklern herumgestritten,
kein Wunder.
Post by Juergen Ilse
aber die Diskussion ist leider ergebnislos im Sande verlaufen und
SUSE hatte die eigentlich so nicht vorgesehene Konfiguration
Um das im Endeffekt doch noch hinzubekommen, muss man »~/.bashrc«
zumindest im interaktiven Fall aus »~/.bash_profile« heraus
Post by Juergen Ilse
(".bashrc" wird, zu- mindest manchmal, auch von ".profile"
gelesen), Andere Distributionen haben sich seitdem leider an
diesen Unfug angepasst.
So ist das halt, wenn man das Handbuch nicht sorgfältig liest:
Dann versteht man die Argumente der anderen nicht und hält sie für
Unfug.
Post by Juergen Ilse
Post by Helmut Waitzmann
Vermutung: Die Einschränkung der Kommandos auf interaktive Shells
kam vom Distributor.
... und zwar als workaround fuer den Unfug,
Nein. Aber das wirst Du erst verstehen, wenn Du das Handbuch
gelesen hast. Von
Post by Juergen Ilse
.profile und .bashrc sich gegenseitig einlesen zu lassen.
steht im im Handbuch gemachten Vorschlag nichts.

Ob SUSE darüber hinaus noch etwas tut, was nicht nötig wäre, um
alle interaktiven Shells »~/.bashrc« lesen zu lassen, kann ich
nicht beurteilen: Ich habe kein SUSE‐System. Deswegen lass' ich
Post by Juergen Ilse
Bei SUSE spielt da vermutlich auch noch eine Variable
"PROFILE_READ" oder so aehnlich eine Rolle, da sonst der vom
Distributor eingebaute workaround fuer ein vom Distributor verur-
sachte Problem nicht fubnktionieren wuerde ...
Post by Helmut Waitzmann
Und da glaubst Du, ein Anwender, der es nicht rafft, mit
Bedacht Änderungen vorzunehmen, ist in der Lage, seine
Crontab‐Umgebung selbst zusammenzustellen?
Das sollte er koennen (oder von cron die Finger lassen).
Wie gut er es kann, sieht man ja bei Stackoverflow. Oder er fragt
im Usenet, um sich schlau zu machen.
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
Ja. Aber das ist gewollt, da´man beim Verhalten eines cron-jobs nicht
von einem ggfs. nicht von einem ggfs.nicht selbst gesetzten Environment
abhaengig haben moechte ...
Man kann selbst als bedachtsamer Anwender nicht wissen, ob der
Administrator beispielsweise »/usr/xpg4/bin/« in den PATH stellen
muss, damit sein System POSIX‐kompatibel ist. Das weiß nur der
Administrator. Trotzdem möchte man als Anwender
POSIX‐Kompatibilität haben.
Wenn man dem vom Admin vorgesetzten PATH vertraut, aber dennoch eigene
Aenderungen einbringen will, hat sich "PATH=/home/myuser/bin:${PATH}"
oder dergleichen bewaehrt.
Dazu muss »PATH« aber bereits den vom Administrator
bereitgestellten Inhalt haben.
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
Warum sollte er dass muessen? Genau das Gegenteil ist der Fall. Ein vom
Admin geaendertes /etc/profile kann bei "selbst gesetztem Environment"
keinen Einfluss auf den cron-job haben, und genau das ist es, was man
anstreben sollte. Nur wenn man das Environment selbst setzt, ist man unab-
haengig von ggfs. unangekuendigten Aenderungen vom Admin.
… und fällt auf die Schnauze, wenn so eine Änderung bewirkt, dass
die vom Anwender selbst erstellte Crontab‐Umgebung plötzlich ein
nicht mehr POSIX‐kompatibels System bewirkt.
Deine Argumentation ist doch Unfug. Wie oft hast du es denn schon erlebt,
dass eine vom Admin durchgefuehrte Aenderung einen vormals lauffaehingen
cron-job, der sein eigenes Environment setzt, nicht mehr lauffaehig war?
Weiß ich nicht mehr. Der häufigere Fall war bei mir ein
»ssh«‐Aufruf in einen nicht‐interaktiven Nicht‐Login‐Shell. Der
erhält eine ähnlich unvollständige Umgebung wie ein Cron‐Job. Den
habe ich bald abgestellt, indem ich es hinbekommen habe, »ssh«
einen Login‐Shell starten zu lassen. Ab dann war ein für alle
Male Ruhe im Karton.
Post by Juergen Ilse
Post by Helmut Waitzmann
Du hast vielleicht die folgende Erfahrung nicht gemacht: Ich
hatte schon mit heterogenen Umgebungen zu tun: Dasselbe
HOME‐Verzeichnis wird dem Anwender sowohl von HPUX als auch
Solaris auf verschiedenen Maschinen per NFS zur Verfügung
gestellt. Und natürlich hatte jedes Betriebssystem seine eigene
Belegung der Variablen »PATH«.
... und da erweitert der Anwender das vom Admin bereitgestellte
Environment statt es zu ueberschreiben. Das ist voellig normal.
Dazu muss er es aber erst einmal erhalten (s. o.).
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
und zum testen das script ggfs. auch mal mit leerem Environment
("env -") aufzurufen ...
Exploits findet man damit nicht?– man erzeugt sie womöglich erst.
???
Ich meine mich zu erinnern, dass mir schon Programme (weiß nicht
mehr, welche) unter die Finger gekommen sind, die eine
Konfigurationsdatei im Verzeichnis (in Shell‐Syntax)
»"${HOME:-.}"/«
verwenden. Wenn nun die Variable »HOME« wegen »env -« nicht
definiert ist…
Das stellt man dann aber beim testen fest,
Nein, das stellt man nicht fest, weil diese Programme sich nicht
beschwert haben, wenn sie eine Konfigurationsdatei von jemand
anderem als Kuckucksei ausbrüten.
Post by Juergen Ilse
und kann den Aufruf fuer den Test auf "env - HOME=... ..."
aendern.
Wenn es gut geht, findet man morgen die nächste Umgebungsvariable,
die man noch vergessen hatte. Wie lang machen wir jetzt schon
rum?
Post by Juergen Ilse
Post by Helmut Waitzmann
Post by Juergen Ilse
... was aber nichts daran aendert, dass man *reproduzierbares* Verhalten
moechte, und das kann man letztendlich nur gewaehrleisten, wenn man das
relevante Environment *selbst* setzt.
Das war in der oben erwähnten heterogenen Umgebung mit dem von
verschiedenen Betriebssystemen NFS‐montierten gemeinsamen
Home‐Verzeichnis nicht zu machen, ohne auf eine vom Administrator
gewartete Umgebung zurückzugreifen.
Das ist Unsinn.
Oben hattest Du noch vorgeschlagen, PATH zu erweitern, statt
komplett neu zu setzen.
Post by Juergen Ilse
Wenn man dort in einer Umgebung einen cron-job installiert, wird
der selbe cron-job nicht automatisch auf allen Systemen
installiert. Man kann cron-jobs fuer jedes System unabhaengig
installieren, da die User-crontab-Eintraege nicht unterhalb von
$HOME liegen (bei *keinem* System).
Richtig. Deine Wrapper‐Skripte hast Du aber im Home‐Verzeichnis
liegen. Die darfst Du dann für jedes System extra schreiben und
warten. Das tu' ich mir nicht mehr an.
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Josef Moellers
2019-03-04 07:34:30 UTC
Permalink
Post by Helmut Waitzmann
Anscheinend sieht es wirklich so aus: Will man weiterhin
rumdoktern, nehme man eine Suchmaschine; will man wirklich
vorankommen, nehme man das Usenet.
Das Nette am Usenet ist ja, daß sich dort oft eine (mehr oder weniger
lange ;-) ) Diskussion ergibt, von der vielleicht nicht nur der OP etwas
hat.

Ich habe mich auch schon an Diskussionen beteiligt, weil ich der Meinung
war, es nach inzwischen fast 38 Jahren in der Branche (Unix Level Five)
zu wissen, nur um dann zu lernen, daß ich da auch nur halbgares Wissen
hatte, eben so a la ge-google-t und die erste Lösung als das einzig
Wahre zu nehmen.

Jeder trägt sein Scherflein bei und am Ende haben alles was davon gehabt.

Josef
Helmut Waitzmann
2019-03-01 08:44:17 UTC
Permalink
Post by Josef Moellers
PS "Unix [und damit auch Linux] hat eine Lernkurve, so steil wie die
Eiger-Nordwand."
Dafür ist dann aber, wenn man oben ist, die Aussicht grandios.
Loading...