cisab8888
Goto Top

Frage zu init

Also ich lese gerade ein Buch über LPI und hab dazu eine frage:

Der Autor stellt die Frage, warum ein und dasselbe Skript, durch zwei verschiedene Softlinks aktiviert wurde, einmal einen Deamon startet und dann wieder beendet:

K04apache2
S18apache2

Im Buch steht, dass das Skript durch Abfrage einer Variable ($0) feststellen kann ob es durch einen Dateinamen oder durch Aufruf eines Links gestartet wurde, und mit Verzweigungen innerhalb des Programms reagieren kann.

Meine Frage: Wie stellt das Skript fest, ob es eine Dateiname oder ein Link ist?

lg und danke!

Content-Key: 184546

Url: https://administrator.de/contentid/184546

Printed on: April 26, 2024 at 02:04 o'clock

Member: broecker
broecker May 06, 2012 at 16:16:04 (UTC)
Goto Top
Das tut es gar nicht so wie von Ihnen beschrieben, init (der Startdaemon) startet alle S-Skripte in z.B. Runlevel 5 der Reihe nach (S01...,...,S99...): /etc/rc5.d/S... und gibt ihnen als Parameter "start" mit, in den Skripten sehen Sie die betreffende case-Anweisung, mit der dann nur (z.B) der Start-Teil ausgeführt wird, beim Runterfahren entsprechend der K-Teil ("kill") mit Parameter "stop" - das ist alles, ob also ein Link in rc5.d und/oder init.d liegt oder das Skript selbst reinkopiert wurde ist völlig unerheblich.
HG
Mark
Mitglied: 64748
64748 May 06, 2012 at 16:16:29 (UTC)
Goto Top
Hallo,

die Variable $0 ist der Name des aufgerufenen Programms/Skripts. Beispiel:
#!/bin/bash
echo $0
dieses Srikpt(chen) nenne ich fork.sh, mache es ausführbar (chmod 755 fork.sh) und mache folgendes
markus@samsung:~/Programmierung$ ./fork.sh 
./fork.sh
markus@samsung:~/Programmierung$ ln -s fork.sh forklink.sh
markus@samsung:~/Programmierung$ ./forklink.sh 
./forklink.sh
markus@samsung:~/Programmierung$ 
Über die Variable $0 kann also festgestellt werden, wie der Aufruf erfolgt ist.
Außerdem solltest Du Dich mit dem Begriff "fork" vertraut machen Auf diese Weise werden Prozesse in Unix erzeugt. Lese die Manpage zu fork, außerdem hier http://de.wikipedia.org/wiki/Fork_(Unix) und hier http://www.linuxquestions.org/questions/programming-9/fork-variable-val ...
Bin mir allerdings nicht sicher, ob das Deine Frage beantwortet, dazu müsste ich mich selbst (mal wieder) in die Materie einarbeiten.

Markus
Member: mak-xxl
mak-xxl May 06, 2012 at 17:10:52 (UTC)
Goto Top
Moin cisab8888,

Vorbemerkung:
in einem Shell-Script ist die Variable '$0' immer mit dem Namen der ausgeführten (also rufenden) Datei belegt. Heißt also das Script 'test', so hat die Variable den Wert './test'.
Wird nun neben dem Script 'test' im gleichen Verzeichnis (i.e. 'ls -s test Test') ein Link '[@]Test' angelegt und ausgeführt, so hat die Variable den Wert './Test'. Liegt der Link in einem anderen Verzeichnis und heißt etwa auch 'test' (also so wie das Script), dann kommt es darauf an: Wird der Link mit vollem Pfad gerufen (i.e. '/home/test'), so ist dieser Pfad auch in '$0' zu finden. Wird der Link nur mittels Dateinamen gerufen, enthält '$0' wieder nur den Namen des Scriptes ('./test') - also kein Unterschied feststellbar. Abhilfe schafft dann entweder ein im Link gespeicherter Parameter, der von der Shell in die Variable '$1' gepackt wird - das Script kann den entsprechend verwerten. Aber das ist schon wieder eine andere Baustelle ... oder, ja endlich, eine

mögliche direkte Lösung (Feststellung, ob Link- oder Direktaufruf):

Wenn im Script die Ausgabe eines `ln -l $0` ausgewertet wird, sieht das so aus (unwichtiges weggelassen):

- per Link gerufen: '[diverse Ausgaben] ... /home/user/test -> /test'
- direkt gerufen: '[diverse Ausgaben] ... ./test'

Und beispielsweise anhand dieses Verweises (->) kann man entsprechend reagieren ...

[Edit]
Irgendwie hat dieser Post eine knappe Stunde bis zur Anzeige gebraucht, ich hatte ihn schon abgeschrieben ... Was sich jetzt mit den anderen Posts überschneidet - Entschuldigung, keine Absicht, als ich auf 'Senden' geklickt habe, war da noch nix ...

Und noch eine Anmerkung: Gerade wenn es um den Starten und Stoppen von Prozesse/Diensten geht (nicht nur des Indianers), ist es so, wie in der ersten Antwort beschrieben oder, ohne Dämonen: Der Status irgendeines Dienstes wird abgefragt und darauf reagiert, fertig.
Das Beispiel im Buch ist zwar eine Fingerübung für Shell-Anfänger, aber in dem Zusammenhang, nun ja, ..... hoffentlich nicht allzu irreführend.
[/Edit]


Euch allen einen schönen Sonntagabend, eine friedliche und erfolgreiche Woche, freundliche Grüße von der Insel - Mario