-1

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

但是我正在使用子脚本中的子进程 ex system("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
4

2 回答 2

2

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

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

然后你就不会覆盖其他的pid。

或者,您可以使用fork()andexec()生成子进程,然后父进程将直接获取子进程的 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 进程。

于 2012-09-11T13:24:58.530 回答
1

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

于 2012-09-11T15:21:34.540 回答