Umgebungsvariable im Skript, das per cron ausgefuehrt wird
Hallo zusammen, cron hat nicht nur einen anderslautenden PATH, sondern auch die ganz andere Umgebung mit einigen weinigen gesetzten Variables, die man oft in einer cron-mail unter "X-Cron-Env" sieht. Wie kann ich eine Variable aus der shell-Umgebung in die cron-Umgebung gelten lassen? Dank im voraus. Gruß, peter
Hallo! Am Montag, 23. Februar 2004 11:58 schrieb Matthias Dort:
Wie kann ich eine Variable aus der shell-Umgebung in die cron-Umgebung gelten lassen?
Da gibt es verschiedene Möglichkeiten.
Am einfachsten ist es, das File einzulesen, in dem es für die User
beim Login gesetzt wird. Da ich nicht weiß, welche Shell verwendet
wird, kann ich auch nichts genaueres dazu schreiben; bei der BASH ist
es z.B. eine der Dateien /etc/profile, ~/.bashrc, ~/bash_profile,
~/.inputrc oder /etc/inputrc. Am wahrscheinlichsten aber die erste.
Eingelesen wird sie mit der Zeile
source
On Mon, 23 Feb 2004, Thilo Gramlich wrote:
Hallo!
Am Montag, 23. Februar 2004 11:58 schrieb Matthias Dort:
Wie kann ich eine Variable aus der shell-Umgebung in die cron-Umgebung gelten lassen?
Da gibt es verschiedene Möglichkeiten.
Am einfachsten ist es, das File einzulesen, in dem es für die User beim Login gesetzt wird. Da ich nicht weiß, welche Shell verwendet wird, kann ich auch nichts genaueres dazu schreiben; bei der BASH ist es z.B. eine der Dateien /etc/profile, ~/.bashrc, ~/bash_profile, ~/.inputrc oder /etc/inputrc. Am wahrscheinlichsten aber die erste. Eingelesen wird sie mit der Zeile
source
Danach stehen alle Umgebungsvariablen der Shellumgebung zur Verfügung, die in diesem File deklariert werden.
Falls es sich aber nur um genau einen Pfad handelt, der dafür benötigt wird, ist es ggf. sinnvoller, einfach eine Variable der Art
FOOPATH=/Pfad/zu/meiner/Anwendung
zu deklarieren oder evtl auch die PATH-Variable entsprechend zu erweitern.
Dank für Deine Antwort. Und wie kriege ich diese Variables dann noch in der Bcron-Umgebung? Oder anders gefragt, wie kann ich eine Shell-Variable in die cron-Umgebung "exportieren"? Gruß, peterA
Thilo -- ------------------------------------------------------------------------------------ Thilo Gramlich Thilo (a dot) Gramlich (an at symbol) aktivanet (a dot) de
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
*** Matthias Dort (lxlist@inz2cl01.rzffm.db.de) schrieb heute in suse-linux:
[...] Wie kann ich eine Variable aus der shell-Umgebung in die cron-Umgebung gelten lassen?
Meine Glaskugel zeigt bei dieser Frage nur Rauschen. Vermutlich versteht sie die Frage genausowenig wie ich. Wenn Du wissen möchtest, wie Du in "/etc/crontab" und "/etc/cron.d/*" Variablen setzen kannst, die für die Ausgeführten Kommandos übernommen werden, so lies Dir bitte man -P "less +'/environment'" 5 crontab aufmerksam durch (was mal wieder ein Fall von "Ich hatte meine Lust zu lesen" oder "ich habe man 5 crontab" nicht gefunden, wäre). Wenn Deine Frage ist, wie Du in einem ausgeführten Shell-Script Varia- blen setzen kannst, die fürderhin für alle ausgeführten Scripte gelten, rate ich Dir, das nächste Wochenende in Linux-Klausur an einem Stillen Ort mit vielen Unix- und Linux-Büchern zu gehen und Dir mal ein wenig Deinen eigenen Kopf auch über die Sinnhaftigkeit einer solchen Frage zu zerbrechen. MfG Henning Hucke -- Die schnellere Routine ist immer die, die Du nicht aufrufst!
On Mon, 23 Feb 2004, Henning Hucke wrote:
*** Matthias Dort (lxlist@inz2cl01.rzffm.db.de) schrieb heute in suse-linux:
[...] Wie kann ich eine Variable aus der shell-Umgebung in die cron-Umgebung gelten lassen?
Meine Glaskugel zeigt bei dieser Frage nur Rauschen. Vermutlich versteht
Was meinst Du hier mit Glaskugel? :-)
sie die Frage genausowenig wie ich.
Ja, die Frage bitte genau lesen. Meinerseits versuche ich meine Frage nochmals genauer zu stellen.
Wenn Du wissen möchtest, wie Du in "/etc/crontab" und "/etc/cron.d/*" Variablen setzen kannst, die für die Ausgeführten Kommandos übernommen
Es soll keine neue, nur für cron-job geltende Variable gesetzt werden. Die Frage lautet eher, wie man eine Variable aus der Shell-Umgebung in die cron-env "exportieren" kann.
werden, so lies Dir bitte
man -P "less +'/environment'" 5 crontab
aufmerksam durch (was mal wieder ein Fall von "Ich hatte meine Lust zu lesen" oder "ich habe man 5 crontab" nicht gefunden, wäre).
Wenn Deine Frage ist, wie Du in einem ausgeführten Shell-Script Varia- blen setzen kannst, die fürderhin für alle ausgeführten Scripte gelten,
Keine Variable soll neu gesetzt werden, weder in der Shell-Umgebung noch in cron-Umgebung. Sondern exportieren von dereinen zu den anderen.
rate ich Dir, das nächste Wochenende in Linux-Klausur an einem Stillen Ort mit vielen Unix- und Linux-Büchern zu gehen und Dir mal ein wenig Deinen eigenen Kopf auch über die Sinnhaftigkeit einer solchen Frage zu zerbrechen.
Die Frage ist nicht einfache. Seit Tagen habe ich meine Unix- und Linux-Bücher in bezug auf cron durch gelesen. Die cron(8), crontab(1) und (5) habe ich auch so gar mehrmals gelesen (diese sind nicht lang. Die laengste von den drei hat nur 131 Zeilen!). Ich habe auch im Internet mit google gesucht und noch nichts passendes gefunden. Gruß, peter
MfG Henning Hucke -- Die schnellere Routine ist immer die, die Du nicht aufrufst!
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Matthias Dort schrieb am Mon, 23 Feb 2004 14:30:44 +0100 (MET): Umgebungsvariable im Skript, das per cron ausgefuehrt wird
On Mon, 23 Feb 2004, Henning Hucke wrote:
*** Matthias Dort (lxlist@inz2cl01.rzffm.db.de) schrieb heute in suse-linux:
[...] Wie kann ich eine Variable aus der shell-Umgebung in die cron-Umgebung gelten lassen?
Meine Glaskugel zeigt bei dieser Frage nur Rauschen. Vermutlich versteht
Was meinst Du hier mit Glaskugel? :-)
sie die Frage genausowenig wie ich.
Ja, die Frage bitte genau lesen. Meinerseits versuche ich meine Frage nochmals genauer zu stellen.
Wenn Du wissen möchtest, wie Du in "/etc/crontab" und "/etc/cron.d/*" Variablen setzen kannst, die für die Ausgeführten Kommandos übernommen
Es soll keine neue, nur für cron-job geltende Variable gesetzt werden. Die Frage lautet eher, wie man eine Variable aus der Shell-Umgebung in die cron-env "exportieren" kann.
werden, so lies Dir bitte
man -P "less +'/environment'" 5 crontab
aufmerksam durch (was mal wieder ein Fall von "Ich hatte meine Lust zu lesen" oder "ich habe man 5 crontab" nicht gefunden, wäre).
Wenn Deine Frage ist, wie Du in einem ausgeführten Shell-Script Varia- blen setzen kannst, die fürderhin für alle ausgeführten Scripte gelten,
Keine Variable soll neu gesetzt werden, weder in der Shell-Umgebung noch in cron-Umgebung. Sondern exportieren von dereinen zu den anderen.
rate ich Dir, das nächste Wochenende in Linux-Klausur an einem Stillen Ort mit vielen Unix- und Linux-Büchern zu gehen und Dir mal ein wenig Deinen eigenen Kopf auch über die Sinnhaftigkeit einer solchen Frage zu zerbrechen.
Die Frage ist nicht einfache. Seit Tagen habe ich meine Unix- und Linux-Bücher in bezug auf cron durch gelesen. Die cron(8), crontab(1) und (5) habe ich auch so gar mehrmals gelesen (diese sind nicht lang. Die laengste von den drei hat nur 131 Zeilen!). Ich habe auch im Internet mit google gesucht und noch nichts passendes gefunden.
Gruß, peter
MfG Henning Hucke
Hi, "aus der Shell" kannst Du keine Variable "in cron" "exportieren". Du kannst in die shells, die cron öffnet, mit der ganz üblichen export-Syntax eine Variable exportieren. Aber zuvor muß die cron-shell sie kennen. Du mußt Dich von dem Gedanken lösen, Du wärest bei cron-Prozessen eingeloggt. Auch wenn Du in Deiner crontab was ausführen läßt oder in der root-crontab Dich als user angibst: dies hat nur Einfluß auf Dateirechte etc. Cron verwendet dennoch seine eigene (eingeschränkte) Umgebung mit nur wenigen Variablen und einem kurzen PATH. Für den Rest mußt Du sorgen. Wie Du an die Variablen Deiner Login-shell kommst, hast Du ja schon gelesen. hth -- Joerg Thuemmler sysadmin@vordruckleitverlag.de Vordruck Leitverlag GmbH Berlin, ZNL Freiberg Halsbruecker Str. 31b, 09599 Freiberg, Germany Tel. +49 (0)3731/303121
On Mon, 23 Feb 2004, Joerg Thuemmler wrote:
Matthias Dort schrieb am Mon, 23 Feb 2004 14:30:44 +0100 (MET): Umgebungsvariable im Skript, das per cron ausgefuehrt wird
On Mon, 23 Feb 2004, Henning Hucke wrote:
*** Matthias Dort (lxlist@inz2cl01.rzffm.db.de) schrieb heute in suse-linux:
[...] Wie kann ich eine Variable aus der shell-Umgebung in die cron-Umgebung gelten lassen?
Meine Glaskugel zeigt bei dieser Frage nur Rauschen. Vermutlich versteht
Was meinst Du hier mit Glaskugel? :-)
sie die Frage genausowenig wie ich.
Ja, die Frage bitte genau lesen. Meinerseits versuche ich meine Frage nochmals genauer zu stellen.
Wenn Du wissen möchtest, wie Du in "/etc/crontab" und "/etc/cron.d/*" Variablen setzen kannst, die für die Ausgeführten Kommandos übernommen
Es soll keine neue, nur für cron-job geltende Variable gesetzt werden. Die Frage lautet eher, wie man eine Variable aus der Shell-Umgebung in die cron-env "exportieren" kann.
werden, so lies Dir bitte
man -P "less +'/environment'" 5 crontab
aufmerksam durch (was mal wieder ein Fall von "Ich hatte meine Lust zu lesen" oder "ich habe man 5 crontab" nicht gefunden, wäre).
Wenn Deine Frage ist, wie Du in einem ausgeführten Shell-Script Varia- blen setzen kannst, die fürderhin für alle ausgeführten Scripte gelten,
Keine Variable soll neu gesetzt werden, weder in der Shell-Umgebung noch in cron-Umgebung. Sondern exportieren von dereinen zu den anderen.
rate ich Dir, das nächste Wochenende in Linux-Klausur an einem Stillen Ort mit vielen Unix- und Linux-Büchern zu gehen und Dir mal ein wenig Deinen eigenen Kopf auch über die Sinnhaftigkeit einer solchen Frage zu zerbrechen.
Die Frage ist nicht einfache. Seit Tagen habe ich meine Unix- und Linux-Bücher in bezug auf cron durch gelesen. Die cron(8), crontab(1) und (5) habe ich auch so gar mehrmals gelesen (diese sind nicht lang. Die laengste von den drei hat nur 131 Zeilen!). Ich habe auch im Internet mit google gesucht und noch nichts passendes gefunden.
Gruß, peter
MfG Henning Hucke
Hi,
"aus der Shell" kannst Du keine Variable "in cron" "exportieren". Du kannst in die shells, die cron öffnet, mit der ganz üblichen export-Syntax eine Variable exportieren. Aber zuvor muß die cron-shell sie kennen. Du mußt Dich von dem Gedanken lösen, Du wärest bei cron-Prozessen eingeloggt. Auch wenn Du in Deiner crontab was ausführen läßt oder in der root-crontab Dich als user angibst: dies hat nur Einfluß auf Dateirechte etc. Cron verwendet dennoch seine eigene (eingeschränkte) Umgebung mit nur wenigen Variablen und einem kurzen PATH. Für den Rest mußt Du sorgen. Wie Du an die Variablen Deiner Login-shell kommst, hast Du ja schon gelesen.
hth -- Joerg Thuemmler sysadmin@vordruckleitverlag.de Vordruck Leitverlag GmbH Berlin, ZNL Freiberg Halsbruecker Str. 31b, 09599 Freiberg, Germany Tel. +49 (0)3731/303121
Schönen Dank zuerst! Das von mir benutzte Wort "exportieren" ist nur kurz ausgeliehen, deswegen in doppelten Anführungszeichen. In der Shell-Umgebung habe ich eine Variable, die richtig gesetzt und korrekt exportiert ist. So weit so gut, wenn ich das Skript, das diese Variable enthält, perl Kommando-Zeile aufrufe, ist alles problemlos. Ich könnte diese Variable in der crontab explizit setzen. (Vielleicht deswegen war in den vorherigen postings auch mal von dem Wort "Variable setzen" die Rede und die Vorschläge, Unix- und Linux-Bücher zu lesen, kammen wahrscheinlich auch von daher. ) Allerdings hat diese so gesetzte Variable mit der in der Shell-Umgebung nicht mehr zu tun, obwohl die beiden einen denselben Namen haben könnten. Gruss, peter
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo! Am Montag, 23. Februar 2004 15:23 schrieb Matthias Dort:
Ich könnte diese Variable in der crontab explizit setzen. (Vielleicht deswegen war in den vorherigen postings auch mal von dem Wort "Variable setzen" die Rede und die Vorschläge, Unix- und Linux-Bücher zu lesen, kammen wahrscheinlich auch von daher. ) Allerdings hat diese so gesetzte Variable mit der in der Shell-Umgebung nicht mehr zu tun, obwohl die beiden einen denselben Namen haben könnten.
Die Umgebung, die cron benutzt, hat NICHTS mit der Umgebung zu tun, die von einer Shell genutzt wird; wie schon zuvor geschrieben ist sie ziemlich abgestrippt. Das ist auch so gewollt, da cron nicht den ganzen Ballast von langen Pfaden und Dutzenden von Umgebungsvariablen mit sich herumschleppen soll. Ich vermute, es geht Dir darum, daß mit einer Änderung alle Skripte, auch die cron-gesteuerten, die gleichen Werte für eine oder mehrere Umgebungsvariablen haben. Dann schlage ich vor, daß Du die entsprechende(n) Variable(n) in eine separate Datei auslagerst, die von allen Skripten (incl. den Login-Skripten) einfach per source eingelesen wird. An der Umgebung des cron würde ich nichts ändern. Wenn es darum geht, ein Binary mit einer bestimmten Umgebung per cron zu starten, dann schreibe ein Skript, das die Umgebung setzt, dann das Programm startet, und lasse diese Skript vom cron starten. Thilo -- ------------------------------------------------------------------------------------ Thilo Gramlich Thilo (a dot) Gramlich (an at symbol) aktivanet (a dot) de
Am Montag, 23. Februar 2004 17:33 schrieb Thilo Gramlich:
Am Montag, 23. Februar 2004 15:23 schrieb Matthias Dort:
Ich könnte diese Variable in der crontab explizit setzen. (Vielleicht deswegen war in den vorherigen postings auch mal von dem Wort "Variable setzen" die Rede und die Vorschläge, Unix- und Linux-Bücher zu lesen, kammen wahrscheinlich auch von daher. ) Allerdings hat diese so gesetzte Variable mit der in der Shell-Umgebung nicht mehr zu tun, obwohl die beiden einen denselben Namen haben könnten.
Die Umgebung, die cron benutzt, hat NICHTS mit der Umgebung zu tun, die von einer Shell genutzt wird; wie schon zuvor geschrieben ist sie ziemlich abgestrippt. Das ist auch so gewollt, da cron nicht den ganzen Ballast von langen Pfaden und Dutzenden von Umgebungsvariablen mit sich herumschleppen soll.
Und um es noch deutlicher zu machen: _Jede_ Umgebungsvariable gilt grundsätzlich nur für die Shell, in der sie gesetzt (z. B. per source aus Konfigurationsdateien oder per "export VAR=WERT") wurde. Es gibt keine Umgebungsvariable, die sozusagen systemweit gilt.
Ich vermute, es geht Dir darum, daß mit einer Änderung alle Skripte, auch die cron-gesteuerten, die gleichen Werte für eine oder mehrere Umgebungsvariablen haben. Dann schlage ich vor, daß Du die entsprechende(n) Variable(n) in eine separate Datei auslagerst, die von allen Skripten (incl. den Login-Skripten) einfach per source eingelesen wird. An der Umgebung des cron würde ich nichts ändern.
ACK echo "export VAR=WERT" >>/pfad/zur/konfigdatei und dann im cronScript: . /pfad/zur/konfigdatei Jan
On Mon, 23 Feb 2004, Thilo Gramlich wrote:
Hallo!
Am Montag, 23. Februar 2004 15:23 schrieb Matthias Dort:
Ich könnte diese Variable in der crontab explizit setzen. (Vielleicht deswegen war in den vorherigen postings auch mal von dem Wort "Variable setzen" die Rede und die Vorschläge, Unix- und Linux-Bücher zu lesen, kammen wahrscheinlich auch von daher. ) Allerdings hat diese so gesetzte Variable mit der in der Shell-Umgebung nicht mehr zu tun, obwohl die beiden einen denselben Namen haben könnten.
Die Umgebung, die cron benutzt, hat NICHTS mit der Umgebung zu tun, die von einer Shell genutzt wird; wie schon zuvor geschrieben ist sie ziemlich abgestrippt. Das ist auch so gewollt, da cron nicht den ganzen Ballast von langen Pfaden und Dutzenden von Umgebungsvariablen mit sich herumschleppen soll. ACK!
Ich vermute, es geht Dir darum, daß mit einer Änderung alle Skripte, auch die cron-gesteuerten, die gleichen Werte für eine oder mehrere Umgebungsvariablen haben. Dann schlage ich vor, daß Du die entsprechende(n) Variable(n) in eine separate Datei auslagerst, die von allen Skripten (incl. den Login-Skripten) einfach per source eingelesen wird. An der Umgebung des cron würde ich nichts ändern.
Diese Tage habe ich neben dem Lesen auch viele Versuche gemacht. `source <filename>` funktioniert nur dann, wenn der Variable einen konkreten Wert zugewiesen wird. Es klappt nur so zum Beispiel: <snip> nv:/tmp> cat cronenv.sh source /tmp/.profile_cron ; echo $myVar nv:/tmp> cat .profile_cron export myVar=/dir2 nv:/tmp> crontab -l # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.10653 installed on Tue Feb 24 09:30:42 2004) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) 31 9 24 2 2 /tmp/cronenv.sh > /tmp/cronenv.out nv:/tmp> cat cronenv.out /dir2 <snap> Es klappt zwar; Das gleiche kann man auch erzielen, indem man die Zuweisung (myVar=/dir2) direkt in die crontab oder in das Skript schreibt! Mein urspruengliches Ziel ist aber, eine Variable in der Shell-Umgebung auch dem cron-Prozess bekannt zu machen. Etwa so z.B.: nv:/tmp> cat .profile_cron export myVar=$TESTVAR #wobei TESTVAR eine Variable in der Shell-Env ist. Das funktioniert leider nicht. Es scheint mir so, was shell kennt (in shell-env), cron aber nicht kennt (nicht in cron-env), lernt cron nicht kennen. Es sei denn, dass man die Variablenzuweisung in crontab schreibt. Also muss dem cron eine Variable aus der shell-Umgebung, über eine "Brücke" oder einen "Vermittler", bekannt gemacht werden.
Wenn es darum geht, ein Binary mit einer bestimmten Umgebung per cron zu starten, dann schreibe ein Skript, das die Umgebung setzt, dann das Programm startet, und lasse diese Skript vom cron starten.
Es ist nicht der Fall.
Thilo -- ------------------------------------------------------------------------------------ Thilo Gramlich Thilo (a dot) Gramlich (an at symbol) aktivanet (a dot) de
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo! Zuerst mal eine Anmerkung zu Deinen Antworten: ich bekomme Sie immer doppelt, einmal direkt und einmal über die Liste. Einmal reicht mir vollkommen ... Am Dienstag, 24. Februar 2004 10:36 schrieb Matthias Dort:
[Schnipp]
Mein urspruengliches Ziel ist aber, eine Variable in der Shell-Umgebung auch dem cron-Prozess bekannt zu machen.
Frage: braucht cron diese Variable, um zu laufen? Ich behaupte mal, nein. Also sollte cron diese Variable auch nicht kennen. Die Variable ist für die Programme von Interesse, die der cron aufruft. Also setze sie auch nur dort, am besten eben via source <filename>. Wenn es sich jetzt um eine Variable handelt, deren Wert sich von Zeit zu Zeit ändert (z.B. als Ergbnis eines Programmes/Skripts), dann sorge eben dafür, daß der Wert in der Datei geändert wird, die von den anderen per source gelesen wird. Das Problem beim Ändern der Umgebung von Programmen wie cron liegt darin, daß man sich Seiteneffekte einhandeln kann (. Ich habe mir eben mal schnell die manpage und den Aufruf in der /etc/rc.d/cron angesehen; es wird keine Datei genannt, mit der man die Umgebung des cron alleine beeinflussen kann. Es ist also vom Autor auch garnicht gewollt, daß man die Umgebung ändert. In meinem Job kommt es häufiger vor, daß ich für ein Skript eine Umgebung brauche, die für die Benutzer-Shell schon gesetzt ist, aber für meine Skripte, die z.B. beim Starten des Rechners, vom cron oder von unserer Applikation angestoßen werden, eben nicht zur Verfügung steht. Dann wird eben aus der entsprechenden Konfigurationsdatei der entsprechende Teil so ausgelagert, daß er für mehrere Skripte per source zur Verfügung steht.
[Schnipp]
Das funktioniert leider nicht. Es scheint mir so, was shell kennt (in shell-env), cron aber nicht kennt (nicht in cron-env), lernt cron nicht kennen. Es sei denn, dass man die Variablenzuweisung in crontab schreibt.
Wenn Du in der Shell-Umgebung eine Variable per Skript dauerhaft setzen möchtest, dann geschieht das üblicherweise per EXPORT VAR=VALUE Cron scheint solch eine Möglichkeit nicht zu bieten. Warum auch, was cron an Variablen braucht, kennt es. Um den Rest soll sich bitte das jeweilige Programm / Skript selber kümmern. Thilo -- ------------------------------------------------------------------------------------ Thilo Gramlich Thilo (a dot) Gramlich (an at symbol) aktivanet (a dot) de
On Tue, 24 Feb 2004, Thilo Gramlich wrote:
Hallo!
Zuerst mal eine Anmerkung zu Deinen Antworten: ich bekomme Sie immer doppelt, einmal direkt und einmal über die Liste. Einmal reicht mir vollkommen ...
Sorry für die doppelte Mail!
Am Dienstag, 24. Februar 2004 10:36 schrieb Matthias Dort:
[Schnipp]
Mein urspruengliches Ziel ist aber, eine Variable in der Shell-Umgebung auch dem cron-Prozess bekannt zu machen.
Frage: braucht cron diese Variable, um zu laufen? Ich behaupte mal, nein. Also sollte cron diese Variable auch nicht kennen.
Nein. cron daemon braucht diese Variable nicht und lehnt hartnaeckig ab, diese von Shell zu übernehmen.
Die Variable ist für die Programme von Interesse, die der cron aufruft. Also setze sie auch nur dort, am besten eben via source <filename>.
Wie gesagt, man kann diese explizite Wertzuweisung auch direkt in das Skript bzw. in die crontab schreiben.
Wenn es sich jetzt um eine Variable handelt, deren Wert sich von Zeit zu Zeit ändert (z.B. als Ergbnis eines Programmes/Skripts), dann sorge eben dafür, daß der Wert in der Datei geändert wird, die von den anderen per source gelesen wird. Ja. Aber cron übernimmt nicht eine ihm unbekannte Shell-Variable. Die Variable, die cron nicht kennt, muss explizit neu gesetzt werden, entweder im Skript, das cron ausführt, oder in der crontab, oder in einer Datei <file> in Verbindung mit `source <file>`. Allerdings wenn man eine Variable in dieser Weise explizit setzt, ist sie eine völlig neue Variable und hat leider nicht mehr mit der Shell-Variable zu tun!
Das Problem beim Ändern der Umgebung von Programmen wie cron liegt darin, daß man sich Seiteneffekte einhandeln kann (. Ich habe mir eben mal schnell die manpage und den Aufruf in der /etc/rc.d/cron angesehen; es wird keine Datei genannt, mit der man die Umgebung des cron alleine beeinflussen kann. Es ist also vom Autor auch garnicht gewollt, daß man die Umgebung ändert.
In meinem Job kommt es häufiger vor, daß ich für ein Skript eine Umgebung brauche, die für die Benutzer-Shell schon gesetzt ist, aber für meine Skripte, die z.B. beim Starten des Rechners, vom cron oder von unserer Applikation angestoßen werden, eben nicht zur Verfügung steht. Dann wird eben aus der entsprechenden Konfigurationsdatei der entsprechende Teil so ausgelagert, daß er für mehrere Skripte per source zur Verfügung steht.
[Schnipp]
Das funktioniert leider nicht. Es scheint mir so, was shell kennt (in shell-env), cron aber nicht kennt (nicht in cron-env), lernt cron nicht kennen. Es sei denn, dass man die Variablenzuweisung in crontab schreibt.
Wenn Du in der Shell-Umgebung eine Variable per Skript dauerhaft setzen möchtest, dann geschieht das üblicherweise per
Nein. Eben nicht dauerhaft. Sonst könnte ich in crontab schreiben: export var=<konstant> Sondern der Wert ändert sich, und zwar oft, zeitlich unregelmäßig. Unter Shell wird dies dynamisch, automatisch behandelt.
EXPORT VAR=VALUE
Cron scheint solch eine Möglichkeit nicht zu bieten. Warum auch, was cron an Variablen braucht, kennt es. Um den Rest soll sich bitte das jeweilige Programm / Skript selber kümmern.
Dann gibt es wahrscheinlich nur eine Lösung, dass ich die Variablen-Zuweisung immer wieder per Hand ändere. Schönen Dank, Thilo! peter
Thilo -- ------------------------------------------------------------------------------------ Thilo Gramlich Thilo (a dot) Gramlich (an at symbol) aktivanet (a dot) de
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Am Dienstag, 24. Februar 2004 14:32 schrieb Matthias Dort:
On Tue, 24 Feb 2004, Thilo Gramlich wrote:
Am Dienstag, 24. Februar 2004 10:36 schrieb Matthias Dort:
[Schnipp]
Mein urspruengliches Ziel ist aber, eine Variable in der Shell-Umgebung auch dem cron-Prozess bekannt zu machen.
Frage: braucht cron diese Variable, um zu laufen? Ich behaupte mal, nein. Also sollte cron diese Variable auch nicht kennen.
Nein. cron daemon braucht diese Variable nicht und lehnt hartnaeckig ab, diese von Shell zu übernehmen.
Nochmal! Es _gibt_ keine allgemein gültigen Shell-Variablen! Es gitb auch nicht "die Shell-Umgebung"! _Jede_ Shell kennt exakt nur die Variablen, die für sie gesetzt wurden. Das Bekanntmachen kann entweder über das Sourcen einschlägiger Konfigurationsdateien (z. B. /etc/profile oder ~./bashrc, ...) oder direkt in der gestarteten Shell über ein VAR=WERT (bzw. ein export VAR=WERT, wenn die Variable auch in Subshells der aktuellen Shell gelten soll). Wenn die Shell (der laufende Prozess) beendet wird, ist auch ihre Umgebung weg - es sei denn, der Prozess schreibt seine Umgebung (z. B. per env) in eine Datei, um sie beim nächsten Start wieder einlesen zu können (eher unüblich). Wenn Du also innerhalb eines crontab-Jobs eine Variable brauchst, dann musst Du sie setzen - und das geht genauso wie in Login-Shells oder Shellscripts. Der Unterschied zu Login- und interaktiven Shells ist der, dass crontab beim Start eine andere Umgebung (z. B. keine /etc/profile oder ~/.profile) einliest und deshalb eine andere - meist sehr eingeschränkte - Umgebung zur Verfügung hat. Versuche Dir bitte zu merken: Eine Umgebung gilt prinzipiell für einen laufenden Prozess. Es gibt keine "Shell-" oder "Linux-" Umgebung. Jeder Prozess liest seine ihn interessierende Konfiguration ein, dafür haben die meisten bestimmte Defaults (z. B. die Login-Shell), wenn Du selbst ein Script schreibst, musst Du auch selbst dafür sorgen, dass es die benötigte Konfiguration kriegt. Wenn Du das Script nur von einer interaktiven Shell aus startest, dann kannst Du (mit Einschränkungen) von bestimmten gesetzten Umgebungsvariablen ausgehen (die die Shell, von der aus Du Dein Script startest gesetzt und exportiert hat), wenn Du es im cron einsetzen willst, dann kannst Du das nicht. [...]
Ja. Aber cron übernimmt nicht eine ihm unbekannte Shell-Variable. Die Variable, die cron nicht kennt, muss explizit neu gesetzt werden, entweder im Skript, das cron ausführt, oder in der crontab, oder in einer Datei <file> in Verbindung mit `source <file>`. Allerdings wenn man eine Variable in dieser Weise explizit setzt, ist sie eine völlig neue Variable und hat leider nicht mehr mit der Shell-Variable zu tun!
s. o. - es gibt _keinen_ Prozess, der ihm unbekannte Variablen nutzen kann - er muss sie setzen oder der ihn aufrufende Prozess muss sie setzen und exportieren.
EXPORT VAR=VALUE export?
Das hängt wahrscheinlich von der im Script genutzten Shell ab - IIRC unterstützt die Bourne-Shell dieses Konstrukt nicht, dann muss man explizit VAR=VALUE; export VAR benutzen.
Dann gibt es wahrscheinlich nur eine Lösung, dass ich die Variablen-Zuweisung immer wieder per Hand ändere.
NEIN! Thilo hat Dir doch geschrieben, wie Du das machen kannst: Source die einschlägigen Konfigdateien, in denen die Variable gesetzt wird, oder bau Dir ne eigene Datei. Jan
*** Matthias Dort (lxlist@inz2cl01.rzffm.db.de) schrieb am Feb 23, 2004 in...:
On Mon, 23 Feb 2004, Henning Hucke wrote:
Zunächst mal: Bitte nimm zur Kenntnis, dass Mails in die Liste mit Kopie an den Autor (vice versa) ein nono sind und dies auch in der Liste inzwischen _vielfach_ dokumentiert wurde.
[...]
Wenn Du wissen möchtest, wie Du in "/etc/crontab" und "/etc/cron.d/*" Variablen setzen kannst, die für die Ausgeführten Kommandos übernommen
Es soll keine neue, nur für cron-job geltende Variable gesetzt werden. Die Frage lautet eher, wie man eine Variable aus der Shell-Umgebung in die cron-env "exportieren" kann.
Wenn Du die Dir zur Verfügung stehende Dokumentation und die Bücher, so wie Du es selber schreibst, durchgelesen hättest, sollte Dir bekannt sein, dass auf normalem Wege ausschliesslich *Vererbung* möglich ist. Nichtmal der Ansatz eines 35 21 * * * root eval `/mein/script/das/name/value/paare/ausgibt` kann funktionieren, weil dieser Befehl *latürlich* nicht von Cron selber, sondern von einer von Cron gestarteten Shell ausgeführt wird, sodass diese Variablen nur solange leben, wie diese Shell (siehe "man \ 5 crontab").
[... Zitierte Sig ...]
Zitieren von Sigs ist bäbä! Bitte unterlassen. MfG Henning Hucke -- An Standart (z.B. auf einem Bein stehend) halte ich relativ wenig fuer falsch. Das Wort wird nur sehr haeufig verwechselt mit Standard. Tom Bihr in de.etc.sprache.deutsch
participants (5)
-
Henning Hucke
-
Jan.Trippler@t-online.de
-
Joerg Thuemmler
-
Matthias Dort
-
Thilo Gramlich