2014-10-16 68 views
2

我有一些测试代码:如何从父perl守护进程获取pid?

#!/usr/bin/perl 
use strict; 
use warnings; 
use Proc::Daemon; 

my $daemon = Proc::Daemon->new; 
Proc::Daemon::Init(); 
my $kid_pid = $daemon->Init(
    { work_dir  => '/home/develop', 
     pid_file  => 'pid.txt', 
     exec_command => 'perl /home/develop/test.pl ', 
    } 
); 
$| = 1; 

while (1) { 
    my $status = $daemon->Status([$kid_pid]); 
    if (!$status) { 
     my $kid_pid = $daemon->Init(
      { work_dir  => '/home/develop', 
       pid_file  => 'pid.txt', 
       exec_command => 'perl /home/develop/test.pl ', 
      } 
     ); 
    } 
    sleep(5); 
} 

我需要的脚本test.pl知道他的PID。给他一个PID作为参数将是理想的,但是在Init方法的论据中给他$ kid_pid的课程是不可能的。从文件读取选项是不合适的。

现在我需要知道父脚本的PID。代码my $ppid = Proc::Daemon::Init();不为我工作,因为我有循环脚本,他工作不正确。 $$不起作用,因为Proc::Daemon::Init()有另一个PID。

+0

'exec_command => “的perl /home/develop/test.pl $$”'然后'$ ARGV [0]''里面test.pl' – 2014-10-16 11:35:12

+0

问题还是实际的,因为我不知道怎么弄来自子守护程序的父pid。从文件中读取并不适合我。 – Alexandr 2014-10-16 13:49:31

+0

'$ ARGV [0]'在命令行中。 – 2014-10-16 13:52:03

回答

1

您可以使用$$变量获得当前PID,使用getppid()可以获得当前PID。

perl -E 'say fork || getppid, " me:[$$]"' 
7503 me:[7477] 
7477 me:[7503] 
+0

'getppid' in test.pl从'init --user'命令返回PID,不是我父母的PID,也不是他PID – Alexandr 2014-10-16 10:13:35

+0

'$$'为我工作:) 现在我开始怀疑父PID还需要,如何得到它?) 脚本中的循环不允许我使用一些像这样的'my $ ppid = Proc :: Daemon :: Init();' – Alexandr 2014-10-16 10:27:09

+0

'$$'现在不工作,因为'Proc ::守护进程:: Init()'有另一个PID。 – Alexandr 2014-10-16 10:34:32