退出流程在Perl中启动

时间:2011-12-08 07:00:01

标签: perl process exit

您好我如何能够退出在Linux机器上使用qx //在perl中启动的已完成的进程?

我正在考虑调用ps来查找PID并调用kill来退出。但我想知道是否有更简单的方法来做到这一点。

由于

3 个答案:

答案 0 :(得分:4)

如果它是用qx//启动并且已经完成,则没有必要杀死它,它已经消失了。我怀疑你的实际上可能会被卡住:没有完成流程,但是不再对你做任何有用的事了。

你无法直接从操作的Perl端做到这一点。 qx//是同步通话。它期望它启动的进程终止,它唯一的返回代码是进程的STDOUT转储。 (略微,它的返回代码通过$?

它不打算产生后台进程。因此,它使您无法访问孩子的PID,更不用说工作控制了。

因此,在您的情况下,如果这是一次性问题,您只需通过psgrepkill的任意组合找到并终止错误流程, pgreppkill最适合您的思维方式。如果这是一个经常出现的问题,您应该从内置qx//设施迁移到一些可以让您更好地控制的设施。例如,IPC::Run提供超时。

答案 1 :(得分:3)

我认为你要问的真正的问题是“我如何在后台开始一个过程(以后可能会杀掉它)?”

最简单的解决方案是open来自流程的管道。而不是

my $output = qx/some_command/;
# do something with $output
你会做的

my $pid = open my $pipe, "some_command |"  or die $!;
while (my $line = <$pipe>) {
    # do something with $line
    last if some_condition();
}
close $pipe  or $! and die $!;

如果close子进程终止之前的管道,下次尝试输出时它会收到一个SIGPIPE信号,这通常会杀掉它。如果您怀疑该进程可能会继续运行而不生成任何输出,您可以手动kill进行操作,例如

kill $pid, 1;  # 1 == SIGHUP on most Unix systems

(在关闭管道之前你应该这样做,因为close将等待进程终止。)

但是,请注意,如果Perl必须调用shell来解析您的命令,open返回的进程ID将是shell的进程ID,而不是实际命令。您可以使用open

的多参数形式来避免这种情况
my $pid = open my $pipe, '-|', $command, @command_args  or die $!;

答案 2 :(得分:1)

您可以使用

pkill -o -u urbanspr1nter -f some_command

pgrep ... | xargs ps代替pkill首先审核。