Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跟踪日志和分支多个外部(perl)脚本的守护程序_Perl_Logging_Fork_Tail Recursion_Tail - Fatal编程技术网

跟踪日志和分支多个外部(perl)脚本的守护程序

跟踪日志和分支多个外部(perl)脚本的守护程序,perl,logging,fork,tail-recursion,tail,Perl,Logging,Fork,Tail Recursion,Tail,我试图编写一个程序,实际上是一个守护进程,它留在内存中,并在快速更新的日志文件上执行类似于tail-F的操作。然后,当程序检测到文件上的新行时,必须启动另一个编译的perl脚本,该脚本将在日志行上执行一些操作,然后用post发送它 为了清楚地解释,我将这两个程序称为“prgTAIL”和“prgPROCESS”。因此,prgTAIL跟踪日志并启动prgPROCESS,将新行传递给它 显然,prgTAIL不必等待prgPROCESS结束进程,因为prgTAIL必须保留在内存中并不断检测日志上的新行。

我试图编写一个程序,实际上是一个守护进程,它留在内存中,并在快速更新的日志文件上执行类似于tail-F的操作。然后,当程序检测到文件上的新行时,必须启动另一个编译的perl脚本,该脚本将在日志行上执行一些操作,然后用post发送它

为了清楚地解释,我将这两个程序称为“prgTAIL”和“prgPROCESS”。因此,prgTAIL跟踪日志并启动prgPROCESS,将新行传递给它

显然,prgTAIL不必等待prgPROCESS结束进程,因为prgTAIL必须保留在内存中并不断检测日志上的新行。此外,文件更新速率需要启动多个并行prgPROCESS实例。出于这个原因,我使用了两个程序:第一个小而快速的程序只需将数据传递给第二个,这可能会更重,因为它可以在多个实例中启动

在我使用的prgTAIL上:

跟踪日志文件的管道

在新日志行上启动prgPROCESS的while循环

叉子;在不等待PRG进程结束的情况下继续

my $log_csv = "/log/csv.csv";
open (my $pipe, "-|", "tail", "-n0", "-F", $log_csv) or die "error";
while (<$pipe>) {
    $line = $_ ;
    my $pid = fork();
    if (defined $pid && $pid == 0) {
        exec("/bin/prgPROCESS ".$line) ; # I tried system() too.
        exit 0;
    }
}
怎么了?有什么想法吗?也许prgPROCESS进程不会结束并停留在没有为其他进程腾出空间的情况下

PS:我现在正在使用Mac OS X,但它将在Linux上运行。

您的问题是:

while () {
没有任何约束条件,所以它只是以尽可能快的速度旋转。你从来没有真正阅读过你的管道,你只是在尽可能快地分叉并产生新的脚本

您可能想要:

while ( my $line =  <$pipe> ) { 

    #....
}
while(my$line=){
#....
}
但实际上,您根本不需要fork是有争议的,因为read/process/read循环可能会做得很好-
fork()
exec()
基本上就是系统已经做的事情


如果是分叉,还应该清理子进程。对于短期运行的东西来说,这并不重要,但处于循环中的东西会留下很多僵尸进程。通过设置
$SIG{CHLD}
或使用
waitpid

您需要忽略SIGCHLD信号(这样您的子进程就不会变成僵尸),或者需要使用
waitpid()
或与
WNOHANG
选项相当的工具来清理所有已完成的子进程。或者,您可能需要在执行之前拥有子fork,父进程等待子进程死亡,而孙子进程则由
init
进程继承,该进程主要等待其他进程的子进程死亡。不知何故,你需要确保你的死者被妥善埋葬;如果你不这样做,事情就会变得一团糟,除非你收拾好你的烂摊子,否则系统不会让你玩。你确实是对的。事实上,我忘了在帖子里写条件。。真正的代码有一个条件:while()我将修复原始帖子,抱歉。。我使用fork来保持主程序(prgTAIL)的执行,而不用等待从程序(prgPROCESS)结束。我认为问题在于僵尸程序。我将用$SIG{CHLD}或其他东西测试代码,这样“我的尸体将被妥善埋葬”,我会让你知道的。谢谢
while ( my $line =  <$pipe> ) { 

    #....
}