我正在尝试在perl中运行后台进程。我创建了一个子进程,用于调用另一个perl脚本。我希望与这个子进程并行运行几行代码。子进程完成后。我想打印一行代码。
#!/usr/bin/perl
$|=1;
print "before the child process\n";
my $pid = fork();
if (defined $pid)
{
system("perl testing.pl");
}
print "before wait command\n";
wait();
print "after 20 secs of waiting\n";
#!/usr/bin/perl
print "inside testing\n";
sleep(20);
before the child process before wait command (should wait for 20 secs and then print) after 20 secs of waiting
答案 0 :(得分:7)
您的脚本存在许多问题。总是:
use strict;
use warnings;
local
正在使用特殊变量是一种很好的做法。只有包含特殊值undef
的变量才会为defined
返回false。因此,每个其他值(即使是0
;在这里就是这种情况)对defined
返回true。在另一个脚本中,shebang是错误的。
#!/usr/bin/perl
use strict;
use warnings;
local $| = 1;
print "Before the child process\n";
unless (fork) {
system("perl testing.pl");
exit;
}
print "Before wait command\n";
wait;
print "After 20 secs of waiting\n";
答案 1 :(得分:6)
“Background Processes” section的perlipc documentation读取
您可以在后台运行命令:
system("cmd &");
命令的
STDOUT
和STDERR
(可能STDIN
(取决于您的shell)将与父级相同。由于双SIGCHLD
发生,您无需捕捉fork
;请参阅下面的详细信息。
在程序中向system
的参数添加&符号可以大大简化主程序。
#! /usr/bin/env perl
print "before the child process\n";
system("perl testing.pl &") == 0
or die "$0: perl exited " . ($? >> 8);
print "before wait command\n";
wait;
die "$0: wait: $!" if $? == -1;
print "after 20 secs of waiting\n";
答案 2 :(得分:0)
fork
返回值处理有点棘手。
Recent article by Aristotle提供了一个简洁明快的分叉成语,在您的情况下,它看起来像:
#!/usr/bin/env perl
use 5.010000;
use strict;
use warnings qw(all);
say 'before the child process';
given (fork) {
when (undef) { die "couldn't fork: $!" }
when (0) {
exec $^X => 'testing.pl';
} default {
my $pid = $_;
say 'before wait command';
waitpid $pid, 0;
say 'after 20 secs of waiting';
}
}
注意exec $^X => '...'
行: $ ^ X 变量保存当前Perl可执行文件的完整路径,因此将保证“正确的Perl版本”。此外,当您预先分叉时,system
电话无意义。