我有一个bash脚本,我使用env
从命令行运行,将其输出重定向到log.txt
env FOO=hello BAR=world ./myscript &> log.txt
我想在后台中从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的fork
和exec
调用来在后台运行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";
但我发现当我在|
内使用管道tee
和mainScript
时
| tee main-log.txt
在 perl
中为myScript
创建新程序后,我无法在屏幕上看到输出
如果我从perlScript.pl
拨打mainScript
而没有tee
,一切正常。
在这种情况下如何使用tee
,或者可能有另一种方法来重定向mainScript
的输出,它会同时出现在屏幕和某些日志文件?
答案 0 :(得分:1)
这是未经测试的,但你不能这样做吗?
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";
答案 1 :(得分:0)
答案 2 :(得分:-1)
我会使用IPC :: Open3 perl模块 - https://metacpan.org/pod/IPC::Open3