如何调查卡住的进程 - perl脚本

时间:2014-10-09 23:46:54

标签: linux perl process

我遇到了卡住流程的麻烦。我做了一些调查,但我找不到根本原因。

我使用ps aux | grep scriptname来查找PID。我做了strace,它只是坚持阅读(5,

sudo strace -p 1939
Process 1939 attached - interrupt to quit
read(5,  <unfinished ...>
Process 1939 detached

我检查了/ proc中的fd文件:

sudo ls -l /proc/1939/fd | grep 5
Oct  9 21:20 5 -> pipe:[31041225]

我也使用了lsof,但我没有从中得到任何线索:

/usr/sbin/lsof | grep 31041225
perl5.8.8  1939    5r     FIFO                0,6       0t0   31041225 pipe
perl5.8.8  2252    1w     FIFO                0,6       0t0   31041225 pipe
perl5.8.8  2252    2w     FIFO                0,6       0t0   31041225 pipe
bash       2290    2w     FIFO                0,6       0t0   31041225 pipe
bash       2298    2w     FIFO                0,6       0t0   31041225 pipe
original-  2302    2w     FIFO                0,6       0t0   31041225 pipe

但是对于我的猜测,它可能是由以下代码引起的,

sub runScript {
   my $scriptName = $_[0];
   open(DATA, join(" ", @_) . " 2>&1 |");
   while (<DATA>) { 
      print $_;
   }
   close DATA;
}

需要考虑下一步会是什么......

1 个答案:

答案 0 :(得分:1)

没有对open进行错误检查是一个严重的问题。然而,您发布的代码使用这些参数:

#!/usr/bin/perl
use warnings;
use strict;

runScript('ls','-l');

print "done!";

sub runScript {
   my $scriptName = $_[0];
   open(DATA, join(" ", @_) . " 2>&1 |") or die "Can't open filehandle: $!";
   while (<DATA>) { 
      print $_;
   }
   close DATA;
}

使用不同的参数调用此子例程可能会导致脚本挂起。例如,运行等待用户输入的任何命令:

runScript('vim');

现在你将永远挂起。