Perl调用系统命令并保持脚本同时运行

时间:2012-12-21 16:39:49

标签: linux perl system

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

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

谢谢

4 个答案:

答案 0 :(得分:4)

系统在shell中运行命令,因此您可以使用所有shell功能,包括作业控制。所以只需坚持和在你的命令结束时:

system "sleep 30 &";

答案 1 :(得分:2)

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

检查this。它可能对你有帮助。

还有另一个很好的例子,说明如何在this页面上使用fork。

答案 2 :(得分:1)

由于出版日期不打算成为双关语,但要小心僵尸! 这有点棘手,详见perlipc。 但是,据我了解您的问题,您不需要维护updater和调用者进程之间的任何关系。在这种情况下,更容易“发射并忘记”:

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不再属于进程组,因此即使终止父进程也不会影响子进程。

答案 3 :(得分:1)

http://aaroncrane.co.uk/talks/pipes_and_processes/paper.html

上有一个关于从Perl运行外部程序(包括运行后台进程)的好教程