我遇到了卡住流程的麻烦。我做了一些调查,但我找不到根本原因。
我使用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;
}
需要考虑下一步会是什么......
答案 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');
现在你将永远挂起。