我们的实时服务器遇到了一个问题。
脚本(perl)每天运行大约15到18小时。它每天创建100多个子流程。它有一个命令(我们在命令行solaris框中运行的产品命令),它在perl代码中以反向标记触发。
看起来后面的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位...还有什么我可以吗? :(
答案 0 :(得分:5)
我怀疑你没有检查错误(并且perl对于反引号没有那么容易做到。)
考虑使用IPC::System::Simple的捕获来代替你的反引号/ qx。 正如其文档所说,“如果出现错误,它将会因为错误的详细描述而死亡。”
答案 1 :(得分:1)
它不应该因为反引信号而失败,但是因为它产生了一个新进程,该进程可能会因系统条件而定期出现故障(例如sysLoad)。反引号实际上是一种“一劳永逸”的方法,绝不能用于生产环境中的任何关键任务。如前所述,有更详细的方法来管理产生外部流程。
如果命令的输出因缓冲而丢失,您可能会尝试关闭缓冲,但请注意它以降低性能(通常不重要)。
可以通过在顶部附近添加缓冲来关闭整个脚本的缓冲:
$|=1;
答案 2 :(得分:1)
调用外部命令时,我使用IPC::System::Simple的系统或IPC::Open3的 open3 。