使用Perl,如何检查特定Windows进程是否正在运行?基本上,我想使用'exec'开始一个进程,但是只有当它还没有运行时我才应该这样做。
那么如何知道具有特定名称的进程是否正在运行?有没有提供此功能的Perl模块?
答案 0 :(得分: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/^/;
答案 1 :(得分:3)
你可能正在寻找Proc::ProcessTable(假设你正在使用Unix!)。它使您可以访问进程列表,并且可以查询其字段以查找具有名称的进程。根据您的要求,有相关的软件包可以让您了解各个流程。
答案 2 :(得分:1)
也许您无法控制第二个进程,但如果您这样做,那么执行此操作的好方法是让进程将其pid($$
)写入已知位置的文件中。然后,您可以使用kill($pid, 0)
读取文件并查看该pid是否存在。
答案 3 :(得分: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)