使用Perl,如何檢查特定的Windows進程是否正在運行?基本上,我想用'exec'開始一個進程,但是我應該只在它尚未運行時才這樣做。使用Perl,如何檢查具有給定名稱的進程是否正在運行?
那麼如何知道具有特定名稱的進程是否正在運行?有沒有提供此功能的Perl模塊?
使用Perl,如何檢查特定的Windows進程是否正在運行?基本上,我想用'exec'開始一個進程,但是我應該只在它尚未運行時才這樣做。使用Perl,如何檢查具有給定名稱的進程是否正在運行?
那麼如何知道具有特定名稱的進程是否正在運行?有沒有提供此功能的Perl模塊?
看看下面使用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/^/;
您可能正在尋找Proc::ProcessTable(假設您使用的是Unix!)。它使您可以訪問進程列表,並且可以查詢其字段以查找名稱的進程。有相關的軟件包可以讓你得到單獨的進程,取決於你想要做什麼。
也許你沒有在第二過程控制,但如果這樣做,這樣做的好方法是有過程寫它的PID($$
)到一個文件中的已知位置。然後您可以閱讀該文件,並使用kill($pid, 0)
查看該pid是否存在。
你真正想要的是一種方法來阻止進程在運行時停止運行(如果你有兩個具有相同名稱的不同程序,或者決定命名你的程序explorer.exe?)這適用於我在Linux上:
use Fcntl ':flock';
open SELF, '<', $0 or die 'I am already running...';
flock SELF, LOCK_EX | LOCK_NB or exit;
在我的測試中,代碼不希望在任何塊中。
(source)
如果你這樣做確保清空/刪除該文件在每次運行結束。如果PID被重新發布,你有可能會殺死一個無辜的程序。 – Anon 2009-06-22 21:02:43