2009-06-21 46 views

回答

6

看看下面使用Win32::OLE模塊的例子。它允許您搜索名稱與給定正則表達式匹配的正在運行的進程。

#! 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

您可能正在尋找Proc::ProcessTable(假設您使用的是Unix!)。它使您可以訪問進程列表,並且可以查詢其字段以查找名稱的進程。有相關的軟件包可以讓你得到單獨的進程,取決於你想要做什麼。

1

也許你沒有在第二過程控制,但如果這樣做,這樣做的好方法是有過程寫它的PID($$)到一個文件中的已知位置。然後您可以閱讀該文件,並使用kill($pid, 0)查看該pid是否存在。

+0

如果你這樣做確保清空/刪除該文件在每次運行結束。如果PID被重新發布,你有可能會殺死一個無辜的程序。 – Anon 2009-06-22 21:02:43

0

你真正想要的是一種方法來阻止進程在運行時停止運行(如果你有兩個具有相同名稱的不同程序,或者決定命名你的程序explorer.exe?)這適用於我在Linux上:

use Fcntl ':flock'; 

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

在我的測試中,代碼不希望在任何塊中。

source

相關問題