繁体   English   中英

使用Perl,如何检查具有给定名称的进程是否正在运行?

[英]Using Perl, how do I check if a process with given name is running or not?

使用Perl,如何检查特定的Windows进程是否正在运行? 基本上,我想使用'exec'启动一个进程,但是只有当它还没有运行时我才应该这样做。

那么如何知道具有特定名称的进程是否正在运行? 有没有提供此功能的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;

在我的测试中,代码不希望出现在任何块中。

来源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM