0

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

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

谢谢

4

4 回答 4

5

系统在 shell 中运行命令,因此您可以使用所有 shell 功能,包括作业控制。因此,只需在命令末尾粘贴 & 即可:

system "sleep 30 &";
于 2012-12-21T16:42:00.123 回答
2

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

看看这个。它可能会帮助你。

在这个页面上还有另一个如何使用 fork 的好例子。

于 2012-12-21T16:46:54.847 回答
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不再属于进程组,所以即使杀死父进程也不会影响子进程。

于 2012-12-21T17:40:20.863 回答
1

在http://aaroncrane.co.uk/talks/pipes_and_processes/paper.html上有一个关于从 Perl 运行外部程序(包括运行后台进程)的很好的教程

于 2012-12-21T23:58:58.267 回答