Einleitung Non-warten auf Hintergrund-Prozess in Perl
Habe ich ein Perl-Skript benötigt, um kick-off ein anderer Prozess im hintergrund und verlassen Sie das Menü ohne zu warten, für die anderen Skript zu beenden. Es gibt viele threads auf StackOverflow, die Abdeckung, wie zu warten, in Perl oder wie Sie nicht warten, für andere Programmiersprachen, aber ich kann nicht scheinen, um herauszufinden, die richtige Antwort für Perl.
Ich habe gelesen, bis ganz ein bisschen und dachte, dass ich die richtigen Dinge tun, aber keiner meiner versuche scheinen zu funktionieren richtig. Hier sind alle Varianten die ich bisher ausprobiert habe ohne Erfolg:
system(qq|perl /util/script.pl $id|);
system(qq|perl /util/script.pl $id &|);
exec(qq|perl /util/script.pl $id|);
exec(qq|perl /util/script.pl $id &|);
Mit jeweils der übergeordnete Prozess weiterhin warten, bis das Kind fertig ist, bevor man Sie verlässt. Bitte lassen Sie mich wissen, was mache ich falsch und der richtige Weg zur Gabelung der Prozess im hintergrund.
Dank im Voraus für Eure Hilfe!
Vollständigen code zu Debuggen. Beachten Sie, dass die API->Funktion () - Aufrufe sind Objekt-orientierte Module die code-Basis verwendet, die für bestimmte Funktionen, die Interaktionen mit der Datenbank usw:
sub Add {
my $self = shift;
my $domain = shift;
if(!$self->IsValid($domain)) { return; }
my $SQL = qq| insert into domains set added=NOW(),domain=| . API->Database->Quote($domain);
my $sth = API->DatabaseQuery($SQL);
$SQL = qq| select last_insert_id() |;
$sth = API->DatabaseQuery($SQL);
my $id = $sth->fetchrow_array();
my $command = qq|perl /home/siteuser/util/new.pl $id &|;
system($command);
return {'id'=>$id,'domain'=>$domain};
}
Sie gehen auf 'akzeptieren' keine Antwort hier?
InformationsquelleAutor Russell C. | 2010-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste ist entworfen, um zu arbeiten, Weg -
system
führt den Befehl aus und beendet für Sie zu Ende.Die letzten beiden sind auch so konzipiert, dass Weg -
exec
speziell ist entworfen, um nie zurückzukehren. Es ist im Grunde ersetzt der Elternprozess mit der Kind-Prozess.Jedoch, die zweite sollte den trick tun: der Befehl gestartet von der
system
call shell", welche den string zu führen. Da der string endet mit "&", das bedeutet, dass die shell starten Sie Ihren Befehl als hintergrund-Prozess und beendet seine eigene Ausführung nach, dass Start.Können Sie bitte poste mehr code zeigt, wie #2 nicht funktioniert?
Siehe auch, was passiert, wenn Sie versuchen, backticks oder qx:
Auch, als eine Möglichkeit der Verringerung der unbekannten, können Sie bitte ausführen Folgendes ein und Sag mir, was gedruckt werden:
Ich glaube nicht, dass dein Beispiel zurück nützlich Ausgabe.
Ich dachte, die zweite war so richtig gut, aber das Skript ist definitiv das warten auf den Kind-Prozess zu beenden. Wenn ich den Kommentar aus dem system () - Zeile der übergeordneten Skript beendet, fast sofort und mit dieser Zeile dauert es 3-4 Sekunden, um zu beenden, die ist, wie lange das Kind braucht, um Sie auszuführen. Ich habe versucht, qx und ich habe auch versucht, backticks, aber weder am Ende läuft das Kind. Ich bin mir nicht sicher, was ich bieten kann, helfen bei der Fehlersuche. Irgendwelche Ideen?
du hast Recht. Der qx|| Beispiel nichts zurückgibt.
Kane - gemeint ist die Rückkehr der üblichen shell-hintergrund-Ausgang (z.B. PID hintergrund-Prozess). Es könnte müssen STDERR-Umleitung - keine xtterm vor mir jetzt, so dass ich mich nicht erinnere, wenn "&" Ausgabe geht nach stdout.
InformationsquelleAutor DVK
Rufen Sie
fork()
vor dem Aufrufsystem
oderexec
?Sie sind beide etwa gleichwertig.
Beide sind noch immer verursacht die Eltern zu warten. Irgendwelche Ideen, wie zu ändern, so dass die Eltern nicht warten?
Der richtige Weg ist, um
fork()
zu erstellen, ein Prozess im hintergrund, dann laufensystem
oderexec
aus, dass der Prozess im hintergrund.(Da ist Perl, ich sollte haben begonnen, die Letzte Bemerkung mit "Einem richtigen Weg ...")
InformationsquelleAutor mob
Müssen Sie trennen das Kind von den Eltern.
Siehe perldoc -q-daemon. Oder Proc::Daemon
C. - die Sie nicht brauchen, um ausführen als "für immer" daemon - einfach beginnen, als einer, tun Sie Ihre Arbeit und beenden. Es gibt absolut nichts, das ist technisch anspruchsvoller, der daemon läuft ewig. +1
InformationsquelleAutor runrig
Mit Gabel ist ein guter Weg, um hintergrund-Prozesse:
Das ist seltsam. Sind Sie sicher, dass Sie den exit-Anweisung innerhalb der Kind-block?
Ich habe. Die ganze Sache ist sehr seltsam. Das ist, warum ich hier gepostet. Irgendwelche anderen Ideen, was könnte Los sein?
Ich würde vorschlagen, Sie ersetzen /util/script.pl mit einem einfachen Programm wie z.B.: for (1 .. 10) { print "schlafen $_ ...\n"; sleep 1 } Dies kann helfen, Sie Debuggen das Problem.
InformationsquelleAutor Naveed