2009-06-21 10 views

Antwort

6

Sehen Sie sich das folgende Beispiel an, das das Modul Win32::OLE verwendet. Sie können nach laufenden Prozessen suchen, deren Namen einem bestimmten regulären Ausdruck entsprechen.

#! perl 

use warnings; 
use strict; 

use Win32::OLE qw(in); 

sub matching_processes { 
    my($pattern) = @_; 

    my $objWMI = Win32::OLE->GetObject('winmgmts://./root/cimv2'); 
    my $procs = $objWMI->InstancesOf('Win32_Process'); 

    my @hits; 
    foreach my $p (in $procs) { 
    push @hits => [ $p->Name, $p->ProcessID ] 
     if $p->Name =~ /$pattern/; 
    } 

    wantarray ? @hits : \@hits; 
} 

print $_->[0], "\n" for matching_processes qr/^/; 
3

Sie suchen wahrscheinlich nach Proc::ProcessTable (vorausgesetzt, Sie verwenden Unix!). Es gibt Ihnen Zugriff auf die Liste der Prozesse, und Sie können seine Felder abfragen, um den Prozess mit dem Namen zu finden. Es gibt zusammenhängende Pakete, die es Ihnen ermöglichen, einzelne Prozesse zu durchlaufen, je nachdem, was Sie tun möchten.

1

Vielleicht haben Sie keine Kontrolle über den zweiten Prozess, aber wenn Sie das tun, ein guter Weg, dies zu tun, ist der Prozess seine pid schreiben hat ($$) in eine Datei in einem bekannten Ort. Dann können Sie die Datei lesen und sehen, ob diese PID existiert mit kill($pid, 0).

+0

Wenn Sie, dass Sie sicherstellen, dass die Datei am Ende jeden Durchlaufs leeren/löschen. Wenn die PID erneut ausgestellt wurde, besteht die Gefahr, dass Sie ein unschuldiges Programm beenden. – Anon

+0

Kill 0 prüft nur, ob die PID läuft, aber Sie haben Recht; Die Datei muss bei der Beendigung gelöscht werden. – ysth

0

Was Sie wirklich wollen, ist ein Weg, um einen Prozess vom Laufen zu stoppen, wenn es bereits ausgeführt wird (was ist, wenn Sie zwei verschiedene Programme mit dem gleichen Namen, oder sich entscheiden, Ihr Programm explorer.exe zu nennen?) Dies funktioniert für mich unter Linux:

use Fcntl ':flock'; 

open SELF, '<', $0 or die 'I am already running...'; 
flock SELF, LOCK_EX | LOCK_NB or exit; 

In meiner Prüfung möchte dieser Code in keinem Block sein.

(source)

Verwandte Themen