我有一个perl脚本,我在其中提交了一个hadoop命令以在后台运行,在while循环中为另一个输入文件中的每个记录执行。我的场景是,我必须向unix发出hadoop命令并使其在后台运行,而不是等待后台进程完成,然后转到输入文件中的下一条记录并触发下一条记录。下面的代码在后台提交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文件给出报告。
需要帮助才能做到这一点……
发布于 2015-04-29 19:57:28
我认为您的问题是perl中的nohup [command] &没有像您预期的那样工作。参见here (与标准输出有关的内容。此外,您的回声应该在反引号内)。
例如:
perl -E 'say `nohup sleep 30 & echo \$! > foo.pid &`'不会在后台运行。
但是:
perl -E 'say `nohup sleep 30 > /dev/null & echo \$! > foo.pid`'都会起作用的。话虽如此,建议您在google上搜索更多关于perl后台进程的评论是有根据的。特别是使用fork() (或使用它的某个cpan模块),然后从那里管理子进程。
https://stackoverflow.com/questions/29937693
复制相似问题