您好我如何能够退出在Linux机器上使用qx //在perl中启动的已完成的进程?
我正在考虑调用ps来查找PID并调用kill来退出。但我想知道是否有更简单的方法来做到这一点。
由于
答案 0 :(得分:4)
如果它是用qx//
启动并且已经完成,则没有必要杀死它,它已经消失了。我怀疑你的实际上可能会被卡住:没有完成流程,但是不再对你做任何有用的事了。
你无法直接从操作的Perl端做到这一点。 qx//
是同步通话。它期望它启动的进程终止,它唯一的返回代码是进程的STDOUT转储。 (略微,它的返回代码通过$?
)
它不打算产生后台进程。因此,它使您无法访问孩子的PID,更不用说工作控制了。
因此,在您的情况下,如果这是一次性问题,您只需通过ps
,grep
,kill
的任意组合找到并终止错误流程, pgrep
,pkill
最适合您的思维方式。如果这是一个经常出现的问题,您应该从内置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
首先审核。