Anzeige:
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 46 bis 60 von 76

Thema: Syntax-Problem mit bash-Script

  1. #46
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.860
    hmm, mal sehen
    Zitat Zitat von Fireball22 Beitrag anzeigen
    Dann wäre glaub die einzigste Methode, dass ich das ganze so prüfe, denn bei mir gibt es ja auch die Möglichkeit einen User anzugeben.

    Code:
    if [ [ `pgrep -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 0 ] -o [ `pgrep -u $username -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 1 ] ]; then
    #...
    fi
    hier machst Du es Dir imho noch zu einfach: was passiert, wenn Du das Skript bereits unter anderem Benutzernamen laufen lässt und diesmal ohne $use_user das Teil (re)startest? D. h., wer bist Du -- öhhm, der Nutzer Deines Programms -- denn, wenn $use_user 0 ist? Afaik wäre das $UID...;-)
    Zitat Zitat von Fireball22 Beitrag anzeigen
    Und leider bin ich mit diesem Problem noch nicht weitergekommen, ich komm einfach nicht drauf, wo hier das Problem eig. liegt:
    Die Meldung
    Code:
    + export /home/shoutcast
    ./DeinScript_new: line 29: export: `/home/shoutcast': not a valid identifier
    klingt doch verdächtig danach, daß Du den export lieber mit
    Code:
    export path_shoutcast
    versuchen solltest, statt mit
    Code:
    export $path_shoutcast
    schließlich kannst Du auch den export direkt vor eine etwaige Zuweisung setzen:
    Code:
    export path_shoutcast=/home/shoutcast
    ...das würde bedeuten, daß $path_shoutcast bei Dir erst expandiert wird, bevor es exportiert wird -- zumindest klingt die Meldung so für mich, auch wenn ich das auf dieser Kiste nicht direkt nachvollziehen kann.
    Und wenn es bei Dir auch eine Variable $shoutcast gibt, dann würde das erklären, warum Du beim export $username keinen Fehler bekommst -- statt username wird hier dann einfach shoutcast exportiert..

    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  2. #47
    Registrierter Benutzer
    Registriert seit
    17.12.2007
    Beiträge
    40
    Vielen Dank für dein Posting!

    Bezüglich der If-Anweisung werde ich mir morgen nochmals gründlich Überlegungen darüber machen, aber die export-Anweisung habe ich geradeeben korrigiert =)

    Also leider hab ich das jetzt aus der Fehlermeldung nicht so direkt rauslesen können, weil ich damit leider auch noch nicht so oft damit etwas zu tun hatte, aber jetzt weis ich bescheid =)

    Der ausgeführte Code sieht nun so aus:

    Code:
    h852677:~# ./DeinScript_new start
    + path_shoutcast=/home/shoutcast
    + use_screen=1
    + use_user=1
    + username=shoutcast
    + '[' '!' -e /home/shoutcast/server.pid ']'
    + '[' 1 -eq 1 ']'
    + '[' 1 -eq 1 ']'
    + export path_shoutcast
    + export username
    + screen -dmS sc1 'su -c '\''/home/shoutcast/sc_serv'\'' shoutcast'
    + '[' 0 -eq 0 ']'
    + echo 10176
    + echo -ne '\033[0;32mDONE\033[0m Server wurde gestartet\n\033[0;32mDONE\033[0m PID-File wurde erfolgreich angelegt\n'
    DONE Server wurde gestartet
    DONE PID-File wurde erfolgreich angelegt
    + exit 0
    Allerdings wird der Prozess immer noch nicht gestartet, wo könnte denn dort noch das Problem liegen?
    Hmm... das ist echt seltsam, vorallem weil er ja auch die PID des Prozesses ausgibt, er aber nicht unter ps -ef oder ps aux erscheint...

    MfG
    Michael

  3. #48
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.860
    Moin moin,
    Zitat Zitat von Fireball22 Beitrag anzeigen
    Also leider hab ich das jetzt aus der Fehlermeldung nicht so direkt rauslesen können, weil ich damit leider auch noch nicht so oft damit etwas zu tun hatte, aber jetzt weis ich bescheid =)
    naja, soo viel sagen mir die Meldungen ja auch noch nicht;-)

    Und Korrektur: der vorherige export $username hat einfach die shoutcast-Variable exportiert, ob Du der nu was zugewiesen hast oder nicht.
    Zitat Zitat von Fireball22 Beitrag anzeigen
    Allerdings wird der Prozess immer noch nicht gestartet, wo könnte denn dort noch das Problem liegen?
    Hmm... das ist echt seltsam, vorallem weil er ja auch die PID des Prozesses ausgibt, er aber nicht unter ps -ef oder ps aux erscheint...
    Was passiert eigentlich, wenn Du den Aufruf umdrehst, so daß auch screen als shoutcast läuft?
    Code:
    su -c "screen -dmS sc1 '${path_shoutcast}/sc_serv'" $username
    Das mag Dir im Script die falsche PID rausrücken, aber rein funktionell?

    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  4. #49
    Registrierter Benutzer
    Registriert seit
    17.12.2007
    Beiträge
    40
    Vielen Dank, so funktioniert das ganze perfekt!
    Nur ich dachte immer, dass für andere Benutzer, die Rechte nicht ausreichend sind, um das Programm screen zu verwenden, so war es zumindest auf meinem alten Suse-System, jetzt verwende ich allerdings Debian 3.1 Sarge.

    hmm, mal sehen
    Zitat:
    Zitat von Fireball22 Beitrag anzeigen
    Dann wäre glaub die einzigste Methode, dass ich das ganze so prüfe, denn bei mir gibt es ja auch die Möglichkeit einen User anzugeben.

    Code:

    if [ [ `pgrep -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 0 ] -o [ `pgrep -u $username -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 1 ] ]; then
    #...
    fi

    hier machst Du es Dir imho noch zu einfach: was passiert, wenn Du das Skript bereits unter anderem Benutzernamen laufen lässt und diesmal ohne $use_user das Teil (re)startest? D. h., wer bist Du -- öhhm, der Nutzer Deines Programms -- denn, wenn $use_user 0 ist? Afaik wäre das $UID...;-)
    Hehe, also ich hab mir dein Posting jetzt mehrmals durchgelesen, aber ich vesteh leider nicht ganz wie du das meinst
    Meinst du damit, dass wenn man z. B. jetzt den Server startet, dann Parameter in meinem Script ändert und erneut starten möchte, er dann nicht erkennt, ob der Server bereits läuft?
    An sowas hab ich ja aber allerdings noch nicht gedacht, da mein Script eig. für den Single-Server betrieb ausgelegt sein sollte.
    Und meinst du auch, dass ich noch irgendwo die UID statt den Benutzernamen einbauen sollte?
    Allerdings würde dass doch für den Anwender nur eine Umständlichkeit bedeuten, oder nicht?

    MfG
    Michael

  5. #50
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von rais Beitrag anzeigen
    ...daß Du den export lieber mit
    Code:
    export path_shoutcast
    versuchen solltest, statt mit
    Code:
    export $path_shoutcast
    schließlich kannst Du auch den export direkt vor eine etwaige Zuweisung setzen:
    Code:
    export path_shoutcast=/home/shoutcast
    ...das würde bedeuten, daß $path_shoutcast bei Dir erst expandiert wird, bevor es exportiert wird...
    Stimmt - export erwartet den Identifier (also Variablennamen) so wie eine Zuweisung ohne $. Kleiner Tipp noch: Wenn man sich über die Syntax in Shell-Scripts unsicher ist und nicht erst lange Doku wälzen will, hilft oft ein Blick nach /etc/init.d, in den Start-Scripts dort findet man vieles. Einfach mal ein "grep export *" dort absetzen.

    Jan

  6. #51
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von Fireball22 Beitrag anzeigen
    ...Meinst du damit, dass wenn man z. B. jetzt den Server startet, dann Parameter in meinem Script ändert und erneut starten möchte, er dann nicht erkennt, ob der Server bereits läuft?
    An sowas hab ich ja aber allerdings noch nicht gedacht, da mein Script eig. für den Single-Server betrieb ausgelegt sein sollte.
    Ich glaube, rais meinte es so:
    1. Dürfen auf dem Rechner mehrere Shoutcast-Prozesse unterschiedlicher User gleichzeitig laufen oder immer nur einer?
    2. Was ist der Unterschied zwischen einem sc_serv, der mit einem Usernamen gestartet wird und dem, der ohne User gestartet wird? Läuft der unter root?

    Abhängig davon solltest Du das Script aufbauen. Wenn es eh nur einen geben kann, dann ist mir der Sinn der Option, den sc_serv mit einem Benutzernamen zu starten, nämlich nicht ganz klar.

    Wenn es mehrere sc_serv geben kann - wofür ist dann das Starten / Stoppen ohne Benutzernamen gut? Zum Killen aller sc_serv-Prozesse?

    usw.

    Jan

  7. #52
    Registrierter Benutzer
    Registriert seit
    17.12.2007
    Beiträge
    40
    Ja das stimmt schon, aber mein Script ist eigentlich auch nur dazu gedacht, um EINEN Shoutcast-Server, der egal unter welchem Nutzer läuft kontrolliert werden kann.

    Bei der Möglichkeit, sc_serv ohne einen bestimmten User zu starten, wird der Server mit den aktuellen Rechten ausgeführt, was natürlich nicht zu empfehlen ist, da die meisten SHOUTCast-Server unter vollen Root-Rechten laufen.
    Mit der User-Option wird die Sicherheit des Servers so noch einmal deutlich erhöht
    Das ist der Sinn dieser User-Option.
    Allerdings ist es in beiden Fällen bis jetzt mit meinem Script nicht möglich, mehrere Server gleichzeitig im System laufen zu lassen. (Aber ich denke mal nicht, dass auf einem Server auf einem normalen Anwender-System gleich mehr als ein SHOUTCast-Server läuft, oder?)

    Wenn das alles soweit passt, wäre dann die Test-Anweisung doch evtl. richtig? =)

    Der Unterschied bei der Test-Anweisung besteht darin, dass er bei dem zweiten Test nochmals explizit nur nach dem Prozessen unter der USERNAME-Liste schaut und so gar nicht mal mit anderen Prozessen in "Berührung" kommt.

    Ist das soweit richtig? =)

    MfG
    Michael

  8. #53
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.860
    Moin moin,
    Zitat Zitat von Fireball22 Beitrag anzeigen
    Ja das stimmt schon, aber mein Script ist eigentlich auch nur dazu gedacht, um EINEN Shoutcast-Server, der egal unter welchem Nutzer läuft kontrolliert werden kann.
    also wenn es eh nur einen im System geben kann, dann bist Du mit dem von jan61 bereits gezeigtem
    Code:
    if pgrep ... ; then
    bestens gerüstet -- dann interresiert Dich doch nur, ob so ein Teil bereits läuft.
    Zitat Zitat von Fireball22 Beitrag anzeigen
    Bei der Möglichkeit, sc_serv ohne einen bestimmten User zu starten, wird der Server mit den aktuellen Rechten ausgeführt, was natürlich nicht zu empfehlen ist, da die meisten SHOUTCast-Server unter vollen Root-Rechten laufen.
    Wenn das sowieso nicht zu empfehlen ist, dann laß es doch gar nicht erst soweit kommen, als Ansatz vielleicht
    Code:
    if [ $UID -eq 0 ]; then
    # hier Dein Code...
    else
      echo "Muttu erst root werden..."
    fi
    Zitat Zitat von Fireball22 Beitrag anzeigen
    Allerdings ist es in beiden Fällen bis jetzt mit meinem Script nicht möglich, mehrere Server gleichzeitig im System laufen zu lassen. (Aber ich denke mal nicht, dass auf einem Server auf einem normalen Anwender-System gleich mehr als ein SHOUTCast-Server läuft, oder?)
    Naja, mehrere SHOUTcast Server -- wenn das hier nicht nur der gleiche Name ist -- würden das System wohl in die Knie zwingen.;-)

    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  9. #54
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    so ganz blicke ich noch nicht durch die Benutzergeschichten durch. Um mal ein wenig Struktur reinzubringen:

    1. Der Server lauscht auf einem TCP-Port (ich war nun auch mal auf der Shoutcast-Seite - sehr übersichtlich finde ich das übrigens nicht), per Default ist das 8000. Es ist wie beim Highlander: "Es kann nur einen geben" - wenn ein Service auf einem Port lauscht, dann ist der besetzt. Steht übrigens auch auf der Seite. Die ganzen Diskussionen um mehr als einen Server sind also überflüssig.

    2. "Quäle nie das 'root' zum Scherz, denn es könnt' geladen sein" - will meinen: Finger weg von Versuchen, das Ding als Superuser zu starten!

    3. Wenn es sowieso nur einen geben kann - wieso dann das ganze Geraffel mit verschiedenen Usern??? Der entspr. Anwender soll das Ding einfach mit seinem normalen Benutzer starten (der hoffentlich nicht root-Rechte hat). Und dann braucht man die ganzen su -c usw. Verrenkungen auch nicht.

    Damit vereinfacht sich der Ablauf meiner Ansicht nach auf folgende Schritte:
    - Prüfen, ob irgendein sc_serv läuft. Wenn ja, dann ist es völlig egal, mit welchem Benutzer er startet, ein 2. Server ist eh nicht möglich.
    - wenn gestoppt werden soll, dann muss man prüfen, ob der Prozess dem aktuellen Benutzer gehört - wenn nicht, kann er ihn auch nicht stoppen. Auf Multiuser-Systemen gehört sich sowas eh im Normalfall nicht.
    - Wenn kein Server rennt, dann kann er ganz normal mit /pfad/zum/sc_serv gestartet werden, da ist kein su -c oder sonstwas nötig.

    Als einzige Ausnahme würde ich einen Fall (z. B. "stop-force") einbauen, der den sc_serv als root weghaut - kann ja mal sein, dass ein Server Amok läuft. Damit ist man dann aber an den Superuser gebunden und muss das Script eh unter root starten. Wenn man das nicht tut, gibts eine Fehlermeldung (da der Prozess nicht gekillt werden kann), auch da braucht man eigentlich keine Vorwegprüfung der UID (höchstens, um eine entspr. Fehlermeldung zu zeigen). Alternative wäre ein Eintrag in die /etc/sudoers (siehe man sudo), das sollte man sich aber genau überlegen.

    Man kann sich angucken, ob man verschiedene Shoutcast-Installationen auf einem System hinkriegt, um dann bei Bedarf auch mehrere Server auf unterschiedlichen Ports laufen zu lassen, aber da steht erstmal die Frage nach dem Sinn der Sache ;-)

    Jan

  10. #55
    Registrierter Benutzer
    Registriert seit
    17.12.2007
    Beiträge
    40
    Ja genau, als Standard ist der TCP-Port 8000 festgelegt, welcher sich allerdings in der Config des Servers beliebig ändern lässt.

    Das mehrfache Starten eines Shoutcast-Servers ist zwar möglich, allerdings hast du - jan61 - dass auch schon genau richtig erkannt, es würde eigentlich keinen Sinn machen, gleich zwei solche Server auf einem System laufen zu lassen, vor allem auch, weil so eine Konstellation so gut wie nie vorkommen wird, außer auf Servern, deren Rechenleistung fern der Leistung normaler bezahlbarer Server für Privatanwender liegen.

    Genau, eig. sollte ich die Funktion direkt sperren, um solch einen Server als root zu starten, aber vllt. ist es für manche Leute doch aus Testzwecken oder aus irgendwelchen anderen Gründen notwendig auch diesen mal als Root auszuführen, was meint ihr?
    Sollte ich diese Funktion deshalb direkt sperren?

    Und genau, dann werde ich direkt noch einen stop-force Befehl einbauen, die Frage ist nur, wie ich dass dann anstelle, dass er diesen auch speziell mit Root-Rechten killt.
    Frägt er dann nach dem Root-Passwort oder lehnt er den Befehl nicht gleich direkt ab?

    Und das prüfen wäre wie ich schon mal gepostet habe, aber schon von der Syntax und Logik soweit okay, oder?
    Code:
    if [ [ `pgrep -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 0 ] -o [ `pgrep -u $username -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 1 ] ]; then
    #...
    fi
    Den Grund für den Parameter -u im zweiten Test ist einfach, dass er hier explizit nur die Prozesse eines bestimmten Users abfragt und nicht alle, falls noch andere Server außerhalb der Scriptreichweite laufen.

    MfG
    Michael

  11. #56
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von Fireball22 Beitrag anzeigen
    Genau, eig. sollte ich die Funktion direkt sperren, um solch einen Server als root zu starten, aber vllt. ist es für manche Leute doch aus Testzwecken oder aus irgendwelchen anderen Gründen notwendig auch diesen mal als Root auszuführen, was meint ihr? Sollte ich diese Funktion deshalb direkt sperren?
    Nochmal: Wenn der Anwender sich als root anmeldet und dann das Startscript aufruft, dann läuft der Server auch als root. Wenn er sich mit einem anderen Benutzer anmeldet und dann das Script startet, dann läuft es mit dessen User-ID. Dazu brauchst Du kein su -c und keinen $use_user-Schalter. Du kannst nat. eine Sperre einbauen (z. B.: Wenn $UID gleich 0 ist und Modus ungleich "stop-force", dann Fehlermeldung), ich würde aber nicht per Default eine Möglichkeit einbauen, ihn als root zu starten. Laut Webseite ist das nicht notwendig, also sollte man das auch nicht erlauben.

    Zitat Zitat von Fireball22 Beitrag anzeigen
    Und genau, dann werde ich direkt noch einen stop-force Befehl einbauen, die Frage ist nur, wie ich dass dann anstelle, dass er diesen auch speziell mit Root-Rechten killt.
    Frägt er dann nach dem Root-Passwort oder lehnt er den Befehl nicht gleich direkt ab?
    Da gibt es mehrere Möglichkeiten: Der Anwender startet das Script als root oder Du machst ein "su -c Befehl" (dann wird das root-Passwort abgefragt) oder Du startest per sudo, musst dann aber die /etc/sudoers anpassen.

    Zitat Zitat von Fireball22 Beitrag anzeigen
    Und das prüfen wäre wie ich schon mal gepostet habe, aber schon von der Syntax und Logik soweit okay, oder?
    Code:
    if [ [ `pgrep -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 0 ] -o [ `pgrep -u $username -f "${path_shoutcast}/sc_serv"` -a $use_user -eq 1 ] ]; then
    #...
    fi
    Nein, das ist es nicht - hast Du es denn schon mal ausprobiert?

    1. Der Ausdruck `pgrep -f "${path_shoutcast}/sc_serv"` kann 0, 1 oder n PIDs liefern, nur bei genau einer PID geht der Ausdruck nicht schief (auch wenn da eigentlich ein Operator fehlt). Korrekt sollte man den Ausdruck so abfragen (siehe meine Erläuterungen zu Quotings):
    Code:
    if [ -n "`pgrep -f '${path_shoutcast}/sc_serv'`" ...
    Damit kommt immer genau ein Ausdruck für den -n-Operator an.

    2. Du verschachtelst mehrere test-Aufrufe - das geht nicht. Um die Priorität von Bedingungen zu steuern, nutzt man () - entwertet, damit sie die aufrufende Shell nicht auswertet:
    Code:
    if [ \( -n "`pgrep -f '${path_shoutcast}/sc_serv'`" -a $use_user -eq 0 \) -o \( -n "`pgrep -u $username -f '${path_shoutcast}/sc_serv'`" -a $use_user -eq 1 \) ]; then
    Eine andere Alternative wäre die Verknüpfung von 2 test-Aufrufen so:
    Code:
    if [ -n "`pgrep -f '${path_shoutcast}/sc_serv'`" -a $use_user -eq 0 ] || [ -n "`pgrep -u $username -f '${path_shoutcast}/sc_serv'`" -a $use_user -eq 1 ]; then
    Hier wird die Verknüpfung außerhalb eines test durch die Shell erledigt.

    3. siehe unten

    Zitat Zitat von Fireball22 Beitrag anzeigen
    Den Grund für den Parameter -u im zweiten Test ist einfach, dass er hier explizit nur die Prozesse eines bestimmten Users abfragt und nicht alle, falls noch andere Server außerhalb der Scriptreichweite laufen.
    Wie denn, wenn es eh nur einer sein soll? Das geht technisch nicht - vor allem nicht mit dem gleichen Startpfad. Dann würde ja wohl auch die gleiche Konfig gezogen werden und damit auch der gleiche TCP-Port! Und das funktioniert nun mal nicht. Das Üble am 2. Test ist, dass er davon ausgehen würde, dass kein Server läuft, ihn zu starten versuchen um sich dann über Fehlermeldungen des sc_serv zu wundern.

    Jan
    Geändert von jan61 (27-01-2008 um 15:20 Uhr)

  12. #57
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.860
    Zitat Zitat von jan61 Beitrag anzeigen
    2. "Quäle nie das 'root' zum Scherz, denn es könnt' geladen sein" - will meinen: Finger weg von Versuchen, das Ding als Superuser zu starten!
    OkOkOk -- ich tu es auch nie wieder
    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  13. #58
    Registrierter Benutzer
    Registriert seit
    17.12.2007
    Beiträge
    40
    Vielen Dank für dein Posting, das stimmt alles genau, eig. benötigt man zum starten des SHOUTCast-Servers keine Root-Rechte, womit ich die Fuktion eigentlich sperren könnte.
    Das ganze bräuchte ich ja dann auch nur beim Parameter Start abfragen, wie folgt:
    Code:
    if [ \( $UID -eq 0 \) -a \( $check_root -eq 0 \) ]; then
    echo "Das Starten des Servers mit vollen Rechten, stellt ein großes Sicherheitsrisiko dar, möchten sie dennoch starten? Dann tippen Sie bitte 1 ein, andernfalls drücken Sie die Return-Taste..."
    read $option
    if [ $option -eq 1 ]; then
    #...CODE CODE
    else
    echo "Bitte geben Sie in der Konfig des Scripts den gewünschten Username ein"
    #exit 1
    fi
    fi
    Die Option $check_root habe ich deshalb noch eingebaut, dass auch das Starten des Servers möglich ist, wenn das Script automatisch vom System aus den /etc/init.d ausgerufen wird.
    Das ist doch richtig so, oder?
    Und dann würde ich hier noch gerne das Script nach dem letzten echo abbrechen wie es in PHP mit exit; funktioniert, das ist doch hier auch in der BASH möglich, oder? Welchen exit-Wert gebe ich dann allerdings aus?

    Und leider scheint die BASH noch ein Problem mit regulären Ausdrücken zu sein, die es aufeinmal in der Test-Anweisung erkennt:

    Code:
    h852677:~# ./DeinScript_new status
    + path_shoutcast=/home/shoutcast
    + use_screen=1
    + use_user=1
    + username=shoutcast
    ++ pgrep -f '${path_shoutcast}/sc_serv'
    Invalid preceding regular expression++ pgrep -u shoutcast -f '${path_shoutcast}/sc_serv'
    Invalid preceding regular expression+ '[' '(' -n '' -a 1 -eq 0 ')' -o '(' -n '' -a 1 -eq 1 ')' ']'
    ++ pgrep -f '${path_shoutcast}/sc_serv'
    Invalid preceding regular expression++ pgrep -u shoutcast -f '${path_shoutcast}/sc_serv'
    Invalid preceding regular expression+ '[' '(' -z '' -a 1 -eq 0 ')' -o '(' -z '' -a 1 -eq 1 ')' ']'
    + echo -ne 'Server scheint \033[1;37mOFFLINE\033[0m zu sein...\n'
    Server scheint OFFLINE zu sein...
    + exit 0
    Ich hab mir die beiden Tests schon genau angeschaut, allerdings komm ich nicht drauf, was man daran machen könnte, dass dieser sich nicht über einen Fehlerhaften regulären Ausdruck beschwert... hmm...

    MfG
    Michael

  14. #59
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von Fireball22 Beitrag anzeigen
    ...Die Option $check_root habe ich deshalb noch eingebaut, dass auch das Starten des Servers möglich ist, wenn das Script automatisch vom System aus den /etc/init.d ausgerufen wird.
    Das ist doch richtig so, oder?
    Bedingt - auch aus einem rc-Script für den Systemstart heraus brauchst Du den Server nicht unter root laufen zu lassen. In DIESEM Fall kannst Du mit "su USER -c ..." dafür sorgen, dass der Server z. B. mit einem extra dafür angelegten Benutzer USER läuft. root kann "su ..." aufrufen, ohne nach dem Passwort gefragt zu werden.

    Außerdem frage ich mich, warum Du da immer noch einen Usernamen abfragst. Was hat das für einen Sinn? Lass den Server doch unter dem Benutzer laufen, der das Startscript aufruft. Das geht ganz automatisch, ohne dass Du "su -c ..." oder Ähnliches bemühen musst und der Anwender hat nachher auch wieder die Chance, den Server auch ohne Verrenkungen zu stoppen, weil der Prozess ihm gehört.

    Zitat Zitat von Fireball22 Beitrag anzeigen
    Und dann würde ich hier noch gerne das Script nach dem letzten echo abbrechen wie es in PHP mit exit; funktioniert, das ist doch hier auch in der BASH möglich, oder? Welchen exit-Wert gebe ich dann allerdings aus?
    Ganz einfache Regel: Wenn das Script als erfolgreich verarbeitet gelten soll, dann gibst Du 0 als Returncode zurück, wenn es einen Fehler signalisieren soll, dann irgendwas zwischen 1 und 127 (üblicherweise 1, wenn Du nicht zwischen verschiedenen Fehlersituationen unterscheiden willst).

    Zitat Zitat von Fireball22 Beitrag anzeigen
    Und leider scheint die BASH noch ein Problem mit regulären Ausdrücken zu sein, die es aufeinmal in der Test-Anweisung erkennt:...
    Guck Dir bitte mein Beispiel nochmal genau an - hast Du aussen "" um die `...`-Befehlsfolge gelegt? Sieht nicht so aus, dann der Ausdruck ${path_shoutcast} wird bei dir nicht ausgewertet. Poste bitte zu den Meldungen des set -x immer auch die entsprechenden Codezeilen.

    Jan

    P.S.: Am besten, Du schickst mir das Script mal per PM, dann kriegst Du (und die Leser hier ;-) eine kommentierte Version zurück, die zeigt, wie ich das machen würde. Der Thread wird langsam unübersichtlich

  15. #60
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von jan61 Beitrag anzeigen
    ...
    Code:
    if [ -n "`pgrep -f '${path_shoutcast}/sc_serv'`" ...
    Damit kommt immer genau ein Ausdruck für den -n-Operator an....
    Asche auf mein Haupt - genau in diesem Fall (eingeschlossener Befehl in Backticks) werden die '' an die ausführende Shell weitergereicht. Damit werden genau in diesem Fall die inneren '' nicht durch die umschließenden "" entwertet. In dem Fall muss man also so quoten:
    Code:
    if [ -n "`pgrep -f \"${path_shoutcast}/sc_serv\"`" ...
    damit in der Shell, die den ``-Befehl ausführt, die Variable ersetzt wird.

    Sorry für die Verwirrung, so sieht das Ganze im RL aus:
    Code:
    jan@jack:~/tmp/elchtest/1> a=/home/jan
    jan@jack:~/tmp/elchtest/1> echo "ls -d '$a'"
    ls -d '/home/jan'
    jan@jack:~/tmp/elchtest/1> echo "`ls -d '$a'`"
    /bin/ls: $a: Datei oder Verzeichnis nicht gefunden
    
    jan@jack:~/tmp/elchtest/1> echo "`ls -d \"$a\"`"
    /home/jan
    Jan

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •