代码之家  ›  专栏  ›  技术社区  ›  Canopus

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

  •  2
  • Canopus  · 技术社区  · 15 年前

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

    那么,如何知道具有特定名称的进程是否正在运行呢?是否有提供此功能的Perl模块?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Greg Bacon    15 年前

    请看下面使用 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/^/;
    
        2
  •  3
  •   brian d foy    15 年前

    你可能在找 Proc::ProcessTable (假设您使用的是Unix!)。它允许您访问进程列表,您可以查询其字段以查找具有名称的进程。有相关的包允许您访问各个进程,这取决于您想要做什么。

        3
  •  1
  •   ysth    15 年前

    也许你不能控制第二个进程,但是如果你这样做了,一个很好的方法就是让进程写它的PID( $$ )输出到已知位置的文件。然后您可以读取该文件,并使用 kill($pid, 0) .

        4
  •  0
  •   Anon    15 年前

    如果进程已经在运行,您真正想要的是阻止它运行的方法(如果您有两个同名的不同程序,或者决定将程序命名为explorer.exe,该怎么办?)这对我在Linux上很有用:

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

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

    ( source )