* Phillip Richdale schrieb am 04.Nov.2001:
Soweit ich das verstanden habe sind Umgebungsvariablen bestimmte Variablen die beim Start eines Betriebssystems bestimmte Werte eingetragen bekommen, damit alles im OS diese nutzen kann um bestimmte Informationen bei Bedarf sofort zur Hand zu haben.
So ungefähr, aber nicht nur beim Start des Systems, sondern auch beim Einloggen, was ja ein großer Unterschied ist. Es können mehere Personen gleichzeitig eigeloggt sein und sie können sich auch wieder ausloggen, ohne den Rechner runter zu fahren. Jeder Prozeß hat Umgebungsvariable. Nach dem Systemstart wird als erster Prozeß vom Kernel der Prozeß init gestartet. Dabei werden schon die ersten Variablen gesetzt. Welche das sind, siehst Du wenn Du less /proc/1/environ sagst, natürlich als root. In /proc/1 steht alles interessante zu Prozeß 1 und das ist immer init. Unter anderem das Enviroment, die Umgebung. Bei den anderen Prozessen ist es ähnlich, die Umgebung findest Du unter /proc/PID/environ, wobei PID für die jeweilige Prozeßnummer steht. So zurück zu init. init führt jetzt verschieden Prozesse nach der /etc/inittab aus. Unter anderem auch die mingettys. Dort wird dann nach dem Login, gemäß der /etc/passwd verschiedene Variablen gesetzt, etwa $HOME. Dann wird /etc/passwd, bei SuSE /etc/passwd.local, ~/.bashrc ausgeführt. Hier kann überall neue Umgebungsvariablen gesetzt werden. Wichtig ist, jeder Prozeß hat wie gesagt seine eigene Umgebungsvariablen. Wenn ein Prozeß einen neuen aufruft, so geschieht dies über ein fork. Ein fork macht eine exakte Kopie vom alten Prozeß, der neue Prozeß bekommt lediglich eine neue PID und als PPID bekommt er die PID des alten Prozeß, der alte Prozeß wird damit zum Elterprozeß des neuen, und der neue wird zu einem Kindprozeß des alten. Die Umgebungsvariablen bleiben gleich, mit gleichem Inhalt. In der Regel führt der neue Prozeß nun ein exec... aus. Dadurch wird er mit einem anderen Programm überschrieben, aber die Umgebungsvariablen bleiben erst mal gleich. Das Programm kann nattürlich neue hinzufügen, oder alte verändern oder auch wegnehmen. Auch die Shell ist ein solches Programm. Wichtig ist, daß ein Prozeß immer nur seine eigene Umgebungsvariablen verändern kann, nie das eines anderen Prozesses. Er kann es lediglich an spätere Kindeprozesse vererben. Nicht aber an solche, die es schon gibt.
So eine Art Laufzeit-"Registry", ähnlich wie z.B. bei Windoze9x.
Glaube ich nicht, aber keine Ahnung von Windows.
Wo werden diese bei Linux / bzw. SuSE Linux standardmäßig gesetzt?
Wie gesagt, bei der bash ist es /etc/profile.local und ~/.bashrc. Bei der 7.2 scheint es auch ein /etc/bashrc oder so zu geben, kann ich nichts zu sagen, da ich die 7.2 nicht habe.
Gibt es da überhaupt Standards? /var vielleicht?
Ganz bestimmt nicht. Wie gesagt, jeder Prozeß hat seine eigene Umgebungsvariablen. Bei Dämonen werden sie in den Startskripten gesetzt.
Und kann es sein, daß Umgebungsvariablen an verschiedenen Stellen zu verschiedenen Anlässen gesetzt werden?
Ja.
Wie handhabt Ihr das mit den Umgebungsvariablen?
(Nur zur Erklärung:Anlaß für diese allgemeine Frage ist u.a. gerade diese Fehlermeldung / Warnung die ich krieg, wenn ich ein Javaprogramm starten will
Warning: JAVA_HOME environment variable not set.)
Du startest dieses Javaprogramm ja aus der bash heraus oder aus X. Wenn Du es aus einer bash heraus startest, dann mußt Du es im ~/.bashrc schreiben und exportieren, sonst wird es keine Umgebungsvariable. Für X gibt es die Datei ~/.xsession wo man Umgebungsvariablen setzen kann. In der crontab kann man Umgebungsvariable für cronprozesse setzen und an vielen andern Orten. Über /proc/PID/environ kann man übrigens nichts setzen, da kann man nur lesen. /proc ist keine echte Datei, sondern hier sind spezielle Inahlte des Hauptspeichers. Bernd -- Bitte die Etikette beachten: http://home.t-online.de/~f.walle/etikette.html Bitte Realnamen angeben, kein Vollquoting, kein Html, PGP oder Visitenkarten benutzen. Signatur mit "-- " abtrennen, bei Antworten "Re: " voranstellen, sonst nichts. |Zufallssignatur 4