【问题标题】:How can i get process id of UNIX command i am triggering in a Perl script?如何获取我在 Perl 脚本中触发的 UNIX 命令的进程 ID?
【发布时间】:2014-08-22 23:15:52
【问题描述】:

我在 Perl 脚本中触发了一个 UNIX 命令。

我需要 UNIX 命令的进程 ID。

例如,如果我触发下面的 UNIX 命令:

# padv -s adv.cfg > adv.out &
[1] 4550

我的进程 ID 是 4550。

# ps -ef | grep padv
root      4550  2810  0 16:28 pts/5    00:00:00 padv -s adv.cfg
root      4639  2810  0 16:29 pts/5    00:00:00 grep padv

如何在我的 Perl 脚本中捕获该进程 ID?

例如,我在 Perl 脚本中触发我的命令,如下所示:

#!/usr/bin/perl

use strict;
use warnings;

qx(padv -s adv.cfg > adv.out &);

【问题讨论】:

  • 进程运行了很长时间,所以我想在后台运行它。

标签: perl unix


【解决方案1】:

你可以使用open()

Open 成功时返回非零值,否则返回未定义值。如果打开涉及管道,则返回值恰好是子进程的pid。

my $pid = open(my $ph, "-|", "padv -s adv.cfg > adv.out") or die $!;

$ph 文件句柄读取输出而不是输出重定向:

my $pid = open(my $ph, "-|", "padv -s adv.cfg") or die $!;

【讨论】:

  • 打开管道已经创建了一个分叉。你应该丢掉&
  • 如前所述,打开管道会创建一个分叉,因此已经在“背景”中。不需要&符号。您还可以删除对 adv.out 的重定向,并使用 $ph 文件句柄读取/处理输出。
【解决方案2】:

调用fork 创建子进程。子进程的进程ID返回给父进程。然后子进程可以调用exec来执行你想要的程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2014-02-27
    • 2013-06-09
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2013-02-18
    相关资源
    最近更新 更多