PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage Shellscript (init.d/mysqld)



Nighthawk
26-03-2002, 12:05
Ich verstehe nicht ganz was beim Stoppen des mysqld passiert:

stop(){
/bin/kill `cat /var/run/mysqld/mysqld.pid 2> /dev/null ` > /dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
action $"Stopping $prog: " /bin/true
else
action $"Stopping $prog: " /bin/false
fi
[ $ret -eq 0 ] && rm -f /var/lock/subsys/mysqld
[ $ret -eq 0 ] && rm -f /var/lib/mysql/mysql.sock
return $ret
}

Die fetten Teile versteh ich nicht ganz. Bitte erklären :)
(Nach solchen Zeichenfolgen kann man mit google so schlecht suchen.)

micha
26-03-2002, 12:47
Hi,

/bin/kill `cat /var/run/mysqld/mysqld.pid 2> /dev/null ` > /dev/null 2>&1

Das Programm kill benötigt die Prozess-ID des Programmes, das beendet werden soll. Die PID des MySQL-Deamons speichert dieser in der /var/run/mysqld/mysqld.pid, die mit cat ausgelesen wird und an das Programm kill weitergereicht wird. Dabei wird die Ausgabe von cat und danach von kill nach /dev/null umgeleitet.

[ $ret -eq 0 ] && rm -f /var/lock/subsys/mysqld
[ $ret -eq 0 ] && rm -f /var/lib/mysql/mysql.sock

Heisst soviel wie: Wenn das Beenden des Programmes durch kill erfolgreich war ( mit ret=$? lässt sich der Return-Code des zuvor ausgeführten Kommandos erfragen und in $ret speichern, der dann hier verglichen wird ), lösche die Datei mysqld und und mysql.sock.

Gruß micha

Nighthawk
26-03-2002, 13:26
Also ist [ ... ] && das gleiche als wenn ich if [ ...]; then benutze.
Aber was machen die Zweien vor den größer als Zeichen (2>)?
Und was bedeutet das "&1" hinter dem letzten '>'?

micha
26-03-2002, 13:38
Jupp, ist im Prinzip das Gleiche, da eine UND-Verknüpfung vorliegt. Lohnt sich allerdings nur, wenn Du nur eine Anweisung ausführen willst, für mehr benötigt man dann einen If-Block.

Die 1 steht für die Standardausgabe, die 2 für die Standardfehlerausgabe, d.h. bei cat wird nur die Standardfehlerausgabe nach /dev/null umgleitet und bei kill beides.
Hier findest Du es noch einmal ausführlicher:

http://www.linuxfibel.de/eaumleitung.htm

Gruß micha

Nighthawk
26-03-2002, 13:44
Jetzt hab ich's, danke.

Nighthawk
26-03-2002, 14:41
Noch was, macht
/bin/kill `cat /var/run/mysqld/mysqld.pid 2> /dev/null` > /dev/null 2>&1
nicht das gleiche wie
/bin/kill `cat /var/run/mysqld/mysqld.pid 2> /dev/null` &> /dev/null?
Ich denk ersteres leitet zuerst die Standardausgabe nach /dev/null um und dann die Standardfehlerausgabe dahin wo auch die Standardausgabe hingeleitet wurde, also auch /dev/null. Warum leitet man dann nicht gleich beides, also &>, nach /dev/null um?
Und noch eine Frage, mit der Umleitung der Standardfehlerausgabe von cat nach /dev/null wird verhindert dass kill versucht einen Prozess mit der ID die so aussieht wie die Ausgabe von cat wenn es eine Datei nicht findet (also z.B. cat: datei: Datei oder Verzeichnis nicht gefunden) zu beenden oder? Damit nicht sowas hier passiert
bash: kill: cat:: no such pid
bash: kill: datei:: no such pid
bash: kill: Datei: no such pid
bash: kill: oder: no such pid
bash: kill: Verzeichnis: no such pid
bash: kill: nicht: no such pid
bash: kill: gefunden: no such pid

micha
26-03-2002, 17:12
Warum leitet man dann nicht gleich beides, also &>, nach /dev/null um?

Keine Ahnung, ich nutze nur das & um beide Kanäle umzuleiten. Ob es kleine Unterschiede zwischen beiden Schreibweisen gibt, kann ich Dir nicht mir Sicherheit sagen.

...mit der Umleitung der Standardfehlerausgabe von cat nach /dev/null wird verhindert...

Richtig. Da kill aber troztdem ne Fehlermeldung ausgeben würde ( Usage: ... ) , und man störende/unschöne Meldungen bei den Bootscripten verhindern will, wird das auch noch mit der 2ten Umleitung unterdrückt.

Gruß micha

tomes
26-03-2002, 17:42
1. /bin/kill `cat /var/run/mysqld/mysqld.pid 2> /dev/null ` ---> leite die Ausgabe der Fehlermeldungen (2) von cat in Nirvana (/dev/null )
2. > /dev/null --> leite die Ausgabe von kill ins Nirwana
3. 2>&1 --> gib Fehlermeldungen (2) von kill an die Standartausgabe (&1 - meist die Konsole) aus. z.B. kill: (16000) - No such pid
So werden nur Fehler von kill angezeigt, da nur diese fuer das Beenden des Programmes relevant sind.

T;o)Mes

Nighthawk
27-03-2002, 09:20
Original geschrieben von tomes
2>&1 --> gib Fehlermeldungen (2) von kill an die Standartausgabe (&1 - meist die Konsole) aus. z.B. kill: (16000) - No such pid

Äh... moment, widerspricht sich das nicht mit der Linuxfibel?


user@sonne> mv ~/plumper_versuch /etc/passwd > fehler 2>&1

leitet Standard- und Standardfehlerausgabe in die Datei »fehler« um, wobei hier zunächst die Standardausgabe in die Datei »fehler« umgeleitet wird und nachfolgend die Standardfehlerausgabe dorthin gelenkt wird, wohin auch die Standardausgabe zeigt.

Ganz simple Frage: Ist ">&1" jetzt die Standardausgabe oder das Ziel der letzten Umleitung der Standardausgabe? Ich nehme mal an zweiteres. Wäre dann ">&2" das Ziel der letzten Umleitung der Standardfehlerausgabe? Muss ja eigentlich.