我正在使用 Perl 脚本构建一个 Spark-submit 命令,该命令将触发 Hadoop 集群上长时间运行的 Spark 作业,然后使用 system() 执行该命令。有时,system() 返回 undef 而不是正确的返回代码,从而导致逻辑流程不准确,因为 undef == 0 的计算结果为 true。
我当前的代码:
#!/usr/local/bin/perl5.12 -w
#...
my $exitCode = system("$sparkSubmitCmd");
sleep(10);
if ($exitCode == 0) {
$log->info("$jobName run succeeded.\n");
#Logic if run succeeded
} else {
$log->error("$jobName run failed.\n");
#Logic if run failed
}
在 Spark-submit 启动的底层运行失败后生成此日志:
Argument "" isn't numeric in numeric eq (==) at /usr/local/bfm/etc/SCRIPT_NAME.pl line #.
JOB_NAME run succeeded
# 行指向 $exitCode == 0 if 语句。
这段代码已经工作(并且在 99% 的时间里仍然有效)多年,几乎没有什么问题,并且负责我们的大部分运行,所以我犹豫是否要做出重大改变。
我知道我可以通过在 if 语句中添加 Defined($exitCode) 来切换 undef 的处理方式,但我不想报告误报或误报。这个问题很难重现,因为它只是偶尔发生。我无法确定成功执行是否会返回 undef。
回避报告误报或误报哪个更好的问题,如何完全避免 undef?如果这是不可能的,即使在 undef 的情况下,我如何构建脚本来确定运行状态?
线程或信号处理程序正在崩溃
$?
。可能是 SIGCHLD 信号处理程序。