perl后台进程

时间:2012-11-23 13:43:09

标签: perl background fork sleep wait

我正在尝试在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";

testing.pl

#!/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

3 个答案:

答案 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” sectionperlipc documentation读取

  

您可以在后台运行命令:

system("cmd &");
     

命令的STDOUTSTDERR(可能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电话无意义。