Shell-Scripte schreiben
Tom
- webserver
Hello,
meine letze Frage unter dem Thema Server ist schon wieder drei Tage her, darum traue ich mich jetzt, endlich mal wieder eine zu stellen.
Also los, haut drauf! :-)
Ich krampf mir hier einen Ab mit den diversen Anleitungen für Shell-Scripte, z.B. http://de.wikibooks.org/wiki/Linux-Kompendium:_Shellprogrammierung
Leider schnall ich nicht, wie ich z.B. kill mit der PID aus dem File füttern kann.
Das ist jetzt nur ein Beipiel.
#!/bin/sh
case "$1" in
start)
mount -t reiserfs -o data=journal,notail /dev/hdb1 /hdd2
/usr/bin/mysqld_safe --port=3307 --socket=/hdd2/var/run/mysqld/mysqld.sock --pid-file=/hdd2/var/run/mysqld/mysqld.pid --datadir=/hdd2/var/lib/mysql --log-error=/hdd2/var/log/mysql/mysql-bin.log > /dev/null 2>&1 &
;;
stop)
# stop mysqld no_2
echo -n "stopping the 2nd mysql server"
kill -$TERM < /hdd2/var/run/mysqld/mysqld.pid
# umount hdd2
echo -n "unmounting HDD2"
umount /hdd2
;;
restart)
;;
status)
;;
help)
;;
*)
;;
esac
Die konkreten Fragen die sich daraus ergeben:
Muss das SIGTERM mit dem Dollarzeichen expandiert werden?
Wie bekomme ich die PID aus dem File an kill übergeben?
Ich verstehe auch nicht, wieso ein
echo < filepath nicht funktioniert.
Das Tutorial ist auch noch etwas dünn. Kennt Ihr bessere?
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
hallo!
Wie bekomme ich die PID aus dem File an kill übergeben?
Mit cat macht man das üblicherweise:
PID=cat /hdd2/var/run/mysqld/mysqld.pid
gruß.
roger.
Hello,
Wie bekomme ich die PID aus dem File an kill übergeben?
Mit cat macht man das üblicherweise:
PID=cat /hdd2/var/run/mysqld/mysqld.pid
Mit cat hatte ich es schon probiert, aber ohne die Backticks.
neuer Versuch also:
testserver:~# chmod o+r /hdd2/var/run/mysqld/mysqld.pid
testserver:~# PID=cat /hdd2/var/run/mysqld/mysqld.pid
testserver:~# echo $PID
2531
Das sieht doch schon mal gut aus.
Ein paar Fehlversuche waren natürlich auch dabei...
Leerzeichen _hinter_ dem = scheint also auch nicht erlaubt zu sein.
Dass es zwischen Variable und = verboten ist, steht ja in der Anleitung.
Dann würde PID als Befehl gewertet wrden.
Ok, nur umount will noch nicht.
testserver:~# ./extra stop
stopping the 2nd mysql server under PID=25950
unmounting HDD2umount: /hdd2: device is busy
umount: /hdd2: device is busy
testserver:~#
unmounting HDD2umount: /hdd2: device is busy
^
Da wollte ich gerne einen Zeilenumbruch...
Aber "\n" geht nicht?
Ich brauch ein anständiges Buch zum Shellscripting.
Hab auch alles vergessen in den 25 Jahren.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hallo Tom,
unmounting HDD2umount: /hdd2: device is busy
Da wollte ich gerne einen Zeilenumbruch...
Warum verwendest Du dann die Option -n, die den Zeilenvorschub am Ende der
Zeile verhindert?
echo -n "unmounting HDD2"
man echo
hilft Dir weiter.
Freundliche Grüße
Vinzenz
Hallo Tom,
statt Deiner provokanten Einleitung hättest Du Dir etwas mehr Mühe geben
können, Dein Problem ordentlich zu erläutern.
Leider schnall ich nicht, wie ich z.B. kill mit der PID aus dem File füttern kann.
Das ist jetzt nur ein Beipiel.
was folgt ist ein Beispiel für miserablen Code, den Anfänger hier im Forum
gerne präsentieren: Kein einziger Kommentar erläutert, was passieren soll.
Erwartest Du im Ernst, dass jeder Deine Threads gelesen hat - und daher
weiß, was Du vorhast.
mount -t reiserfs -o data=journal,notail /dev/hdb1 /hdd2
Du willst also eine Partition mounten - in einem Startskript für einen
MySQL-Dämon. Das halte ich persönlich zwar nicht für eine gute Idee, aber
ich habe eine Ahnung, warum Du das machst. Kommentierungswürdig!
Warum überprüfst Du nicht den Erfolg Deiner Aktion?
kill -$TERM < /hdd2/var/run/mysqld/mysqld.pid
und hier würdest Du gern die PID aus der Datei verwenden.
Ich verstehe auch nicht, wieso ein
echo < filepath nicht funktioniert.
"Funktioniert nicht" ist keine Fehlerbeschreibung.
Was erwartest Du? Was bekommst Du?
Warum testest Du die einzelnen Schritte nicht mit einfachen Zweizeilern durch?
info bash ist übrigens sehr informativ. Allerdings werden - wie ich neulich erwähnt habe - bei Debian aus Lizenzgründen die Infoseiten der bash nicht
installiert, Du musst Dir diese anderswoher besorgen.
Die besten Tutorials zum Schreiben von Startskripten sind übrigens die Startskripte andere Demons.
Grüße
Vinzenz
Hello,
Kein einziger Kommentar erläutert, was passieren soll.
Stimmt nicht!
Außerdem geht es nur um den kurzen Abschnitt, der kommentiert ist.
stop)
# stop mysqld no_2
echo -n "stopping the 2nd mysql server"
kill -$TERM < /hdd2/var/run/mysqld/mysqld.pid
# umount hdd2
echo -n "unmounting HDD2"
umount /hdd2
;;
Vielen Dank für die anderen Hinweise. Hatte ich aber schon berücksichtigt.
Abfrage von Rückgabewerten und andere Optionen habe ich hir für das Posting alle herausgenommen, um mich auf das Wesentliche zu beschränken. Andere Scripte habe ich hier haufenweise liegen, leider sind sie nicht gut dokumentiert und auch nicht unbedingt kurz :-(
Den Start-teil habe ich dringelassen, damit klar wird, dass das Laufwerk gemountet wurde und der Server gestartet. Nicht das irgendein Anfänger dann kommt und sagt "ist denn das Laufwerk überhaupt gemountet und läuft denn der Server überhaupt?"
Antworte auf beide Fragen lautet JA.
was könnte an "echo < filepath" nicht funktionieren?
Da ich nichts weiter dazugeschrieben habe, steht zur vermuten, dass einfach nichts weiter passiert. Wenn eine Fehlermeldung gekommen wäre, hätte ich sie mitgepostet, oder, was eher warscheinlich ist, gar nicht erst gepostet, sondern diese zur weiteren Suche benutzt.
Bitte nochmal zurückspulen und von vorne anfangen.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hallo Tom,
Außerdem geht es nur um den kurzen Abschnitt, der kommentiert ist.
stop)
# stop mysqld no_2
sorry, für mich ist _sowas_ kein Kommentar.
Genau solche Kommentare sollte man möglichst vermeiden!
Sie sind weder für einen Anfänger noch für einen Fortgeschrittenen hilfreich.
echo -n "stopping the 2nd mysql server"
kill -$TERM < /hdd2/var/run/mysqld/mysqld.pid
und sowas sind erst recht ein überflüssiger und aussageloser Kommentar.
Du kannst das doch besser. Warum mutest Du uns hier sowas zu? Nein, es ist
ganz und gar keine gute Idee, vernünftige Kommentare aus seinem geposteten
Quelltext zu entfernen.
# umount hdd2
echo -n "unmounting HDD2"
umount /hdd2
Den Start-teil habe ich dringelassen, damit klar wird, dass das Laufwerk gemountet wurde und der Server gestartet. Nicht das irgendein Anfänger dann kommt und sagt "ist denn das Laufwerk überhaupt gemountet und läuft denn der Server überhaupt?"
Wie bitte. Du erwartest also von Anfängern Hilfe, möchtest von diesen aber
nicht mit solchen Frgagen genervt werden - und irritierst Fortgeschrittene.
Solche Aspekte kann man doch wunderbar im Postingtext erwähnen.
Antworte auf beide Fragen lautet JA.
was könnte an "echo < filepath" nicht funktionieren?
vieles: Was ist
filepath
Eine Variable? Eine Zeichenkette, die einen Dateipfad enthält?
Bei mir liefert es übrigens die Fehlermeldung
bash: filepath: Datei oder Verzeichnis nicht gefunden.
Bitte nochmal zurückspulen und von vorne anfangen.
was, bitte, erwartest Du? (Ich gehe jetzt davon aus, dass statt filepath ein
Pfad zu einer Datei steht.)
man echo
echo [OPTION]... [ZEICHENKETTE]...
Gib ZEICHENKETTE(n) auf Standardausgabe aus.
Was soll nun Deine Anweisung bewirken?
Grundsätzlich ist Dein Problem doch eher das: wie lese ich den Inhalt einer
Datei in eine Variable ein - siehe dazu Rogers Beitrag.
Freundliche Grüße
Vinzenz
Hello,
auf der Suche nach verständlichen Tutorials bin ich auch auf
http://www.netzmafia.de/skripten/unix/unix8.html
Das mag ich auch weiterempfehlen
Es gehört zur Vorlesung http://www.netzmafia.de/skripten/unix/
und ich vermute, dass das Gesamtwerk zu UNIX für den "Normal-Programmierer" keine Fragen offen lässt. Aber das kann ich bestimmt erst in einen Monat sagen :-)
(es ist so dick)
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom