bash - Script aus Script starten -> Aufgehangen

LeDoc

New Member
Hallo.

Ich habe hier ein kleines Problemchen, wo ich nicht mehr weiterkomme.

Folgende Problematik:
Ich möchte gerne ein bash-Skript innerhalb eines bash-Skriptes starten.
Das ganze sieht wie folgt aus:
Code:
#! /bin/bash

output1="$(./our_server start)" &
echo "$output1"

exit 0

Anfangs startete dieses Script zwar das Serverscript, beendete sich aber nicht, so dass ich nur mit CTRL-C aus der Geschichte rauskam.
Nachdem ich das "&" hinten angehangen habe, startet nun das Script folglich im bg, und die shell steht mir wieder zur Verfügung.
Dummerweise läuft das Script aber immer noch mit, weshalb ich keine Ausgabe von dem
Code:
echo "$output1"
bekomme, da das Script ja gar nicht bis dahin weiterläuft.

Wie also bringe ich nun dem Script bei, dass das Serverstartscript gestartet werden soll und dann bis zum "exit" durchläuft?

Bin über jede Hilfe erfreut und bedanke mich schonmal im Vorraus.

Gruss,
Doc
 
Würde schon funktionieren, allerdings brauche ich die Rückmeldung von dem Script zur Weiterverarbeitung in Perl.
 
Für Perl sieht sowas bei mir so aus:

Code:
### Apache restarten ###

    print "starte httpd neu:\n";
    system("/etc/init.d/apache2 restart");
    @array = `/etc/init.d/apache2 restart`;

    foreach ( @array ){
    print "$_";
    }

Inklusive der Ausgaben =)

Gruss Rico
 
Noch eine Alternative:

Code:
open (SH, '/bin/sh /etc/init.d/apache2 restart |') or die ("$!\n");
while (<SH>) {
    ...
}
close SH;
 
Wenn ich das jetzt so richtig verstehe, musst du mit EXIT-Codes arbeiten

Exit and Exit Status

Wurde mir als gute Seite weitergeben und ist ganz gut erklärt, hoffe du kannst es so in PERL verwenden

Hoffe ich konnte helfen

mfg Rusticus
 
Vielen Dank zunächst für Eure Beiträge.

@ redled und terx:
Das Problem ist, es muss ein bashscript sein.

Da hilft mir Perl nicht viel weiter.

Und das mit dem Exit ist eine interessante Seite (wieder was gelernt :)), doch das Problem ist ja, dass das Script hier hängenbleibt:

Code:
output1="$(./our_server start)" &

Das wird ausgeführt und weiter gehts nicht, also leider auch keine Rückmeldung, die ich dringend implementieren muss :(

Hab nun auch im Script, was aufgerufen wird, die Stelle gefunden, nach dem ich keine Rückmeldung mehr bekomme (indem ich ein paar Echos einbaute):
Code:
$HOME/server/our_portal_server -D -f$HOME/logs/server/server.log -r$PIDFILE $ADD_PAR

Vielleicht hilft das euch ja zur Erklärung weiter.
Wenn ihr noch was an Codeschnipsel braucht, sagt bescheid :)

Liegt das vlt. daran, dass der Server als Daemon gestartet wird?
 
An deiner makierten Stelle wird der eigentliche Server gestartet. Der Prozess bleibt dabei im Vorderung (Es tritt KEINE Dämonisierung auf, deswegen bleibt dein Programm hängen)

Auch wenn das Start-Skript in Bash geschrieben worden ist, ist es nicht unmöglich, doch Perl zu verwenden. Du sagtest ja, dass du ohnehin Perl zur Weiterverarbeitung brauchst.
Es gäbe nun zwei Wege:
Code:
open (SH, '/bin/sh ./our_server start |') or die ("$!\n");
while (<SH>) {
    ...
}
close SH;

oder du wandelst das Start-Skript ("our_server") in Perl um. Evtl lässt sich dann auch eine gute Dämonisierung erreichen, und das Programm wird allgemein Kompakter (Und es könnten auch weniger Prozesse gestartet werden)
 
Vielen Dank nochmal.
Ihr seid echt Top :) *thumbs_up*

Ich versuche das grad mit einer Mischung von terx und redled's Ideen.

Habe das so angepasst:
Code:
open (SH, '/bin/sh ./our_server start |') or die ("$!\n");
while (<SH>) {
    [COLOR="Blue"]print $_;[/COLOR]
}
close SH;

Klappt sogar fast, nur dass die Ausgabe mitten im Text stehenbleibt.
Der Server startet aber.

Using Mysql-Socket at /var/lib/mysql/mysql.sock You can speed up the starting proces

Scheinbar nähere ich mich aber dem Problem dank eurer Hilfen.

Was die Dämonisierung angeht...
Das Script ist vorgefertigt und das ganze in Perl umzuschreiben traue ich mich nicht...hehehe

Mir wurde halt gesagt, dass der Server als Dämon gestartet wird.
 
Last edited by a moderator:
Minimalistische Dämonisierung:

Code:
$SIG{CHLD} = sub { wait; };
if (fork) {
    print "server gestartet\n";
    exit;
} else {
    open(SH, '/bin/sh ... |');
    ...
    close SH;
    exit;
}

Achja:

Statt "print $_;" geht auch stumpf "print;", da $_ stets das Standard-Argument ist.
 
Vielen Dank nochmal an alle Helfer.
Habs nun mit Umleitungen und Teilen eurer Skripte gelöst.

Gruß,
Doc
 
Back
Top