我知道有很多方法可以做到这一点,但因为有这么多我不知道选择哪一个。
我想要完成的任务:
1.启动几个子脚本
2.能够检查他们是否正在运行
3.能够杀死他们
4.我不需要捕获它们的输出,也不需要显示它们的输出。
这些脚本中的每一个都在他们自己的文件中。
我有一段时间没有编写脚本,而且我陷入了OOP心态,如果我说一些荒谬的话,请原谅我。
答案 0 :(得分:2)
use Parallel::ForkManager qw( );
use constant MAX_SIMUL_CHILDREN => 10;
my $pm = Parallel::ForkManager->new(MAX_SIMUL_CHILDREN);
for my $cmd (@cmds) {
$pm->start()
and next;
open(STDOUT, '>', '/dev/null')
or die($!);
exec($cmd)
or die($!);
$pm->finish(); # Never reached, but that's ok.
}
$pm->wait_all_children();
在循环之前添加以下内容将记录子项的PID。
$pm->run_on_start(sub {
my ($pid, $ident) = @_;
print("Child $pid started.\n");
});
$pm->run_on_finish(sub {
my ($pid, $exit_code, $ident, $exit_signal) = @_;
if ($exit_signal) { print("Child $pid killed by signal $exit_signal.\n"); }
elsif ($exit_code) { print("Child $pid exited with error $exit_code.\n"); }
else { print("Child $pid completed successfully.\n"); }
});
$ident
是传递给$pm->start()
的值。它可以用来给出一个名字"一个过程。
答案 1 :(得分:0)
Perl和parallel并不能很好地融合在一起,但这里有一些想法:
fork()
几次,并独立管理每个孩子open my $fh, '-|', 'command_to_run.sh'
。您可以使用它并轮询这些句柄