gpt4 book ai didi

linux - 以非阻塞方式从 perl 调用 bash 脚本并获取这个新后台进程的 pid

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:52 28 4
gpt4 key购买 nike

我有一个 bash 脚本,我使用 env 从命令行运行它,将其输出重定向到 log.txt

env FOO=hello BAR=world ./myscript &> log.txt

我想在 background 中从 perl 运行一些 myscript 的非阻塞实例。

反过来,perl 脚本通过这种方式从另一个 bash 脚本 mainScript 运行:

#!/bin/bash -x
perlScript.pl | tee main-log.txt

我知道,我可以在这样的循环中使用 perl system() 调用来做到这一点

my $result = system("env FOO=hello BAR=world ./myscript &> log.txt &");

我使用来自 perl 的 forkexec 调用在后台运行 myscript 并获取它的 pid:

$run_cmd = "./myscript";
$run_cmd.= " &> log.txt";

defined(my $pid = fork) or die "$0: fork: $!\n";
if (!$pid) { # child code is here

$ENV{FOO} = 'hello';
$ENV{BAR} = 'world';

exec "exec $run_cmd";
die "$0: failed to exec sh: $!\n";

}

# parent code continues here
print "PID of run_cmd: $pid \n";

但我发现当我在 mainScript 中使用管道 |tee

| tee main-log.txt

perl 中为 myScript 创建新进程后,我在屏幕上看不到输出

如果我在没有 tee 的情况下从 mainScript 调用 perlScript.pl 一切正常。

在这种情况下,我如何使用 tee,或者可能有另一种方法来重定向 mainScript 的输出,它会在 screen 和某些日志文件

最佳答案

这是未经测试的,但你不能这样做吗?

defined(my $pid = fork) or die "$0: fork: $!\n";
if (!$pid) {
$ENV{FOO} = 'hello';
$ENV{BAR} = 'world';
exec 'exec ./myscript &> log.txt';
die "$0: failed to exec sh: $!\n";
}
# parent process here, child pid is in $pid

您甚至可以在 perl 中进行输出重定向,保存对 shell 的调用:

    open STDOUT, '>', 'log.txt' or die "$0: log.txt: $!\n";
open STDERR, '>&', \*STDOUT or die "$0: dup(stdout): $!\n";
exec './myscript';
die "$0: ./myscript: $!\n";

关于linux - 以非阻塞方式从 perl 调用 bash 脚本并获取这个新后台进程的 pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297530/

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