【问题标题】:Submit jobs to run in background using Perl [duplicate]使用 Perl 提交作业以在后台运行 [重复]
【发布时间】:2015-04-29 19:57:28
【问题描述】:

我有一个 perl 脚本,我在其中提交一个 hadoop 命令以在后台运行,在另一个输入文件中的每个记录的 while 循环中。我的情况是,我必须将 hadoop 命令触发到 unix 并使其在后台运行,不要等待后台进程完成并转到输入文件中的下一条记录并触发下一条。 下面的代码在后台提交 hadoop 命令,但它等待它完成,我不想这样做。

open(my $data, '<', $file) or die "Could not open '$file' $!\n";

while (my $line = <$data>) {
  chomp $line;
  my @fields = split "," , $line;
  if( $fields[7] == 'Y' ) {
`nohup sqoop export
--connect
"jdbc:sqlserver://sqlserver:1433;database=$fields[0];user=sa;password=pwd"
--table $fields[2]
--export-dir $src_dir
--input-fields-terminated-by '$fields[3]'
--input-lines-terminated-by '$fields[4]'
--m $fields[5]
--staging-table $fields[6]
--clear-staging-table
--batch > $tgt_dir/$fields[2].out & `;
echo $! > $pid_file;
} 
else {
   next;
}
}

请告诉我该怎么做..

另外,hadoop 命令可以运行几分钟以上。我必须让脚本等待后台命令,在 pid 的帮助下,这些命令被触发并通过 hadoop 命令根据 STDOUT 文件给出报告。

需要有关如何完成此操作的帮助....

【问题讨论】:

  • Perl 中的后台进程有很多很多问题,并且在 Web 其他地方也可以找到帮助。在这里提问之前,您需要付出更多的努力。
  • GNU Parallel 你可能会感兴趣,gnu.org/software/parallel;这是用perl编写的。它可以快速完成您的工作,甚至无需编写复杂的程序来管理工作。

标签: perl


【解决方案1】:

我认为您的问题是 perl 内部的 nohup [command] &amp; 没有按您的预期工作。请参阅here(与标准输出有关。您的回声也应该在反引号内)。

例如:

perl -E 'say `nohup sleep 30 & echo \$! > foo.pid &`'

不为我在后台运行。

但是:

perl -E 'say `nohup sleep 30 > /dev/null & echo \$! > foo.pid`'

会工作。话虽如此,cmets 说您应该在 perl 中搜索更多有关后台进程的信息是有道理的。特别是使用 fork() (或使用它的某些 cpan 模块),然后从那里管理您的子进程。

【讨论】:

  • Parallel::ForkManager 是 child-process-herders 的黄金标准。
猜你喜欢
  • 2013-10-02
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多