1

在我们的实时服务器中遇到了一个问题。

拥有每天运行近 15 到 18 小时的脚本 (perl)。它每天创建 100 多个子流程。它有一个地方有命令(我们在命令行 solaris 框中运行的产品命令),该命令在 perl 代码中用反引号触发。

看起来 back ticks 命令被随机跳过或失败。

例如。如果我需要为 50 个客户运行 2 或 3 个随机失败。

我没有看到该命令已在任何地方触发的证据。

由于它的实时服务器,在我们确定问题之前,我们甚至无法尝试对代码进行太多更改。

这是代码..

my $comm = "inventory -noX customer1"; #sample command i have given here
my $newLogFile = "To capture command output here we have path whre the file gets created");
my $piddy = `$comm 2>&1 > $newLogFile`;                            

是不是因为后面的勾号,我真的不确定:(。

还尝试了各种分析,如内存/CPU/磁盘空间/在 LD_LIBRARY_PATH 中添加 librtld_db.so 等......但没有运气......而且 perl 是 64 位......我还能做什么?:(

4

3 回答 3

5

我怀疑你没有检查错误(而且 perl 并没有让正确地做反引号变得容易)。

考虑使用IPC::System::Simple的捕获代替反引号/qx。正如它的文档所说,“如果出现错误,它将死去,并详细描述出了什么问题。”

于 2012-11-26T01:45:47.720 回答
1

调用外部命令时,我使用IPC::System::Simple的系统或IPC::Open3open3 。

于 2012-11-26T04:52:42.900 回答
1

它不应该仅仅因为反引号而失败,但是因为它正在生成一个新进程,该进程可能会由于系统条件(例如 sysLoad)而定期失败。反引号实际上是一种“一劳永逸”的方法,永远不应该用于生产环境中的任何关键内容。如前所述,有更详细的方法来管理生成的外部进程。

如果命令的输出由于缓冲而丢失,您可以尝试关闭缓冲,但请注意性能下降(通常不重要)。

通过在顶部附近添加以下内容,可以关闭整个脚本的缓冲:

$|=1;
于 2012-11-26T02:59:03.443 回答