Perl没有返回PID

时间:2013-09-01 22:09:16

标签: linux perl bash pid

如果我运行命令

nohup ./run > /dev/null 2>&1 & disown

在我的终端中,我回到了[1] 1234的某些内容,我理解这是PID。

但是,当我在Perl中运行以下内容时,它会返回关于disown未定义的错误或其他内容,但这不是重点。当我删除disown时,终端返回相同的内容,但Perl不返回任何内容。它所分配的变量只是空白。

my $command = `nohup ./run > /dev/null 2>&1 &`;
print("a " . $command); // "a " to check if it's actually printing anything.

输出:

a 

预期产出:

[1] 1234

如何让Perl显示命令的PID,然后我可以用

解析
@ar  = split(/\s+/, $process);
$pid = $ar[1];

在我之前的问题中,另一个Stackoverflow用户提供了这个。

2 个答案:

答案 0 :(得分:8)

[1] 1234仅由bash为交互式shell输出(即以-i选项开头的。)

my $command = `sh -ic 'nohup ./run > /dev/null 2>&1 &' 2>&1`;
die "Can't execute child: $!\n"                if $? < 0;
die "Child killed by signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "Child exited with error ".($? >> 8)."\n"  if $? >> 8;

或更好,

use IPC::System::Simple qw( capture );
capture(q{sh -ic 'nohup ./run > /dev/null 2>&1 &' 2>&1});

另一种选择是使用Daemon::Daemonize“守护”。不幸的是,它只通过pid文件返回PID。

答案 1 :(得分:0)

试试这个

  $pin1=`(nohup ./run >/dev/null 2>&1 \& echo \$! )`