3

如果我运行命令

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

在我的终端中,我得到了一些[1] 1234我理解为 PID 的东西。

但是,当我在 Perl 中运行以下命令时,它会返回关于disown未定义或其他内容的错误,但这不是重点。当我 removedisown时,终端返回相同的东西,但 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 用户提供的。

4

2 回答 2

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。

于 2013-09-01T23:17:17.310 回答
0

尝试这个

  $pin1=`(nohup ./run >/dev/null 2>&1 \& echo \$! )`   
于 2013-09-04T19:07:59.067 回答