Tom: Shell-Scripte schreiben

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

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  1. 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.

    --
    meine freundin sagt, ich wäre neugierig.
    so steht's zumindest in ihrem tagebuch.
    1. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. 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

  2. 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

    1. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. 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

        Hänge das Dateisystem der zweiten Festplatte mit den wichtigen Daten aus.

        Nicht, dass diese versehentlich ins Nirwana befördert werden, bevor sie

        ins neue System übertragen wurden.

        (Ein Backup auf externe Medien wäre sehr anzuraten :-))

        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

  3. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)