Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用Perl,如何检查具有给定名称的进程是否正在运行?_Windows_Perl_Process - Fatal编程技术网

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

Windows 使用Perl,如何检查具有给定名称的进程是否正在运行?,windows,perl,process,Windows,Perl,Process,使用Perl,如何检查特定的Windows进程是否正在运行?基本上,我想用“exec”启动一个进程,但我应该只在它还没有运行的时候这样做 那么,如何知道具有特定名称的进程是否正在运行?是否有提供此功能的Perl模块?您可能正在寻找(假设您使用的是Unix!)。它允许您访问进程列表,您可以查询其字段以查找具有名称的进程。有一些相关的软件包可以让您了解各个流程,具体取决于您想做什么。看看下面使用该模块的示例。它允许您搜索名称与给定正则表达式匹配的正在运行的进程 #! perl use warnin

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


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

您可能正在寻找(假设您使用的是Unix!)。它允许您访问进程列表,您可以查询其字段以查找具有名称的进程。有一些相关的软件包可以让您了解各个流程,具体取决于您想做什么。

看看下面使用该模块的示例。它允许您搜索名称与给定正则表达式匹配的正在运行的进程

#! 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/^/;

也许您无法控制第二个进程,但如果您控制了,一个好方法是让进程将其pid(
$
)写入到已知位置的文件中。然后,您可以使用
kill($pid,0)

读取该文件并查看该pid是否存在。您真正想要的是一种在进程已经运行时停止进程运行的方法(如果您有两个同名的不同程序,或者决定将程序命名为explorer.exe怎么办?)

use Fcntl ':flock';

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

打开SELF,“如果这样做,请确保在每次运行结束时清空/删除该文件。如果重新发布了PID,您将面临杀死无辜程序的风险。kill 0只需检查PID是否正在运行,但您是对的;终止时需要删除该文件。