gpt4 book ai didi

perl - 如何获取 Perl 脚本中执行的程序的 PID

转载 作者:行者123 更新时间:2023-12-04 08:22:53 25 4
gpt4 key购买 nike

This answer解释了如何在使用 Perl 的 exec() 时获取新进程的 pid。 pid甚至没有改变,所以你需要做的就是获取原始脚本的pid。但是,如果我将输出重定向到文件作为命令的一部分(我需要这样做),则它不起作用。

say "my pid is $$";
exec("childscript.pl"); # same pid

但是如果我将输出重定向为命令的一部分:

say "my pid is $$";
exec("childscript.pl > log.txt"); # different pid, usually old pid + 1
exec("childscript.pl > log.txt 2>&1 &"); # same

那么新的 pid 比旧的 pid 高(这可能只是因为它们是连续生成的并且不可靠)。我通过查看输出以及将 sleep 30 插入“childscript.pl”来测试这一点,以便我可以使用 ps -e 看到它。

我的猜测是重定向输出会导致新的进程进行写入。但我需要程序的pid,除了可以执行它之外,我无法控制该程序。 (它也需要在后台运行。)

最佳答案

当您使用单个参数调用 exec 时(并且该参数包含 shell 元字符),perl 会自动为您运行 sh -c ARG。对于您的情况:

exec("childscript.pl > log.txt");
# really means:
exec("/bin/sh", "-c", "childscript.pl > log.txt");

即您的脚本将 sh 加载到当前正在运行的进程中,并保留其 PID。 shell 执行输出重定向,然后将 childscript.pl 作为子进程运行(使用新的 PID)。

有两种方法可以解决这个问题:

  1. 在 Perl 中进行输出重定向并且不生成 shell:

    open STDOUT, ">", "log.txt" or die "$0: log.txt: $!\n";
    exec "childscript.pl";
    die "$0: childscript.pl: $!\n";
  2. 告诉 shell 也使用 exec 并且不生成子进程:

    exec "exec childscript.pl > log.txt";
    die "$0: childscript.pl: $!\n";

关于perl - 如何获取 Perl 脚本中执行的程序的 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53898654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com