2016-06-10 18 views
4

Muss ich einen bestimmten Exitcode verwenden?Wie kann ich einen Prozess in ActiveState Perl sanft beenden?

Win32::Process::Create(
    $ProcessObj, 
    "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe", 
    "firefox -no-remote -P $prof_name", 
    0, 
    NORMAL_PRIORITY_CLASS, 
".")|| die ErrorReport(); 
$ProcessObj->kill(0); 

So tötet es, aber nicht sanft, es erzeugt Probleme mit dem Firefox-Profil.

+1

Wenn es windowed app ist (im Gegensatz zu einer Konsolenanwendung gegen), können Sie ein beenden senden Nachricht an seine Nachrichtenwarteschlange – ikegami

Antwort

5

Kurz   Übliche andere Methoden als Windows taskkill sind energisch. Danke an mob und melpomene.


Die Win32::Process Dokumentation nicht sagen, was die Methoden Kill oder KillProcess tun, aber sie scheinen ziemlich stumpf darüber. Windows bietet eine Gradation, um einen Prozess zu beenden, siehe zum Beispiel diesen Beitrag auf graceful termination via winapi, auch wenn er keine UNIX-Signale hat. Dies wird jedoch offenbar weder vom Modul noch von kill (siehe Ende) genutzt.

Die Windows-eigene taskkill sollte schön bitten, den Prozess zu beenden. Fragen Sie nach Flags, indem Sie taskkill /? in einer Konsole auf Ihrem System ausführen. Hier ist Dokumentation für taskkill on MS technet. Zum Beispiel endet dies den Prozess durch seine $pid, zusammen mit seinen Kindern

my $pid = $ProcessObj->GetProcessID(); 
system("taskkill /t /pid $pid"); 

Wenn die Methode GetProcessID() nicht die reale ID zurückgibt, finden Sie in der unten stehenden Link für andere Möglichkeiten.

Ich kann jetzt nicht unter Windows testen. Es gibt ein bisschen mehr Details in this post, zweiter Teil.


Perls kill ist offenbar unter Windows kraftvoll. Von perlport

... kill($sig, $pid) beendet den Prozess durch $pid identifiziert, und macht es sofort mit Exit-Status $sig verlassen.

Dank melpomene für Kommentar und Dokumentation verknüpfen.

Die exitcode, glaube ich, erzählt nur zu verarbeiten, was dem System als sein Ausgang berichtet.

+0

taskkills '/ F'-Flag bedeutet" und sei nicht sanft " – mob

+0

@mob Ah, danke! Korrigiert. Ich hätte es wissen müssen - F könnte für "Kraft" stehen. – zdim

+0

Windows hat keine Signale. Unter Windows zwingt ['kill $ n, $ pid' den Prozess' $ pid' zum Beenden mit dem Status '$ n'] (http://perldoc.perl.org/perlport.html#kill). – melpomene

0

Soweit ich in Perl wissen, könnten Sie einfach tun

kill -15 (pid) 

Wer sanft einen Prozess in Perl tötet