我在Windows 7中运行Perl脚本,并且遇到有关查找当前正在运行的批处理文件的PID的问题

时间:2012-09-11 13:07:56

标签: perl windows-7

我从父perl脚本启动新的独立Perl脚本[使用系统(启动命令)]。我正在将子脚本的PID写入一个文件中,并在父脚本中读取它,这样每当我想结束子进程时,我就可以使用它的PID来终止它。

但我正在使用来自子脚本的子进程ex系统(“somebatchfile”)调用另一个批处理文件。这里我的PID将更改,我无法关闭它,直到批处理文件完成它的工作。我无法得到它批处理文件的PID。我尝试使用fork函数,但无论如何调用批处理文件将创建自己的其他PID。

我的代码如下。

父脚本:启动一个新脚本并读取PID并在需要时终止已启动的脚本。

儿童剧本:

open(PID,">PID_Value.txt");
print PID "\$Process_id=$$"; # write the PID of child script
close(PID);
system("somebatch file name"); # I am using Windows 7

2 个答案:

答案 0 :(得分:2)

如何将pid附加到文件中呢?

open(PID, ">>PID_Value.txt");
print PID "$$\n";
close(PID);

然后你不会覆盖其他的pids。

或者,您可以使用fork()exec()来生成子进程,然后父进程将直接获取子进程的pid:

my $pid = fork();
die "fork failed: $!" unless defined($pid);
if ($pid) {
  push(@child_pids, $pid); # parent executes this
} else {
  # child executes here
  exec("somebatch file name")
    or die "failed to exec somebatch file name: $!";
}

这将是Unix方式。但是如果您在Windows 7下使用Cygwin perl,我还建议使用Win32::Process::Create(...),因为这会创建一个真正的Windows进程。

答案 1 :(得分:1)

由于您正在创建子进程,而进程又创建了另一个进程来进行批处理,并假设您无法更改批处理代码,我怀疑有选择地终止批处理的唯一方法是迭代所有正在运行的进程名称(使用Win32 :: Process :: Info)来识别批次的PID,然后将其删除。