2012-12-21 126 views
0

我正在运行一个perl脚本,它执行逻辑检查,并且如果满足某些条件。示例:如果超过了一定的时间长度,我想在运行另一个更新该数据的脚本的linux服务器上运行system()命令。更新文件的脚本需要10-15秒,并且必须经过当前文件数量,但在该月份的高峰时段可能长达30秒。Perl调用系统命令并同时保持脚本运行

我想让perl脚本运行,如果它必须运行system()命令,我不希望它在完成脚本的其余部分之前等待system()完成。什么是最好的方式去做这件事?

谢谢

+0

运行在Perl外部程序(包括运行后台进程),能否请您包括您到目前为止所做的事,一些示例代码,一个很好的教程?在给定的问题上提供尽可能多的信息是有帮助的,另外它还向其他人证明在问问题之前您已经做了一些尽职调查。 – slm

回答

4

系统运行在shell命令,所以你可以使用所有的外壳功能,包括作业控制。因此,只要在你的命令的末尾这样坚持&:

system "sleep 30 &"; 
2

使用fork创建一个子进程,然后在孩子使用exec而不是系统调用你的其他脚本。 exec将在单独的过程中执行您的其他脚本并立即返回,这将允许孩子完成。同时,您的父母脚本可以完成它需要做的事情并退出。

检查this了。它可以帮助你。

还有一个很好的例子就是如何在this页面上使用fork。

+0

谢谢你的链接。我认为这会有所帮助! – Sandeme

1

由于发表日期,不打算是双关语,但要小心僵尸! 这有点棘手,详情请参阅perlipc。 但是,据我了解您的问题,您不需要维护更新程序和调用程序进程之间的任何关系。在这种情况下,更容易只是“射后不理”:

use strict; 
use warnings qw(all); 
use POSIX; 

# fork child 
unless (fork) { 
    # create a new session 
    POSIX::setsid(); 

    # fork grandchild 
    unless (fork) { 

     # close standard descriptors 
     open STDIN, '<', '/dev/null'; 
     open STDOUT, '>', '/dev/null'; 
     open STDERR, '>', '/dev/null'; 

     # run another process 
     exec qw(sleep 10); 
    } 

    # terminate child 
    exit; 
} 

在这个例子中,sleep 10不属于进程的组了,所以甚至杀害父进程将不会影响孩子。