【问题标题】:Perl call a system command and keep the script running at the same timePerl 调用系统命令并保持脚本同时运行
【发布时间】:2012-12-21 16:39:48
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您能否提供一些示例代码来说明您到目前为止所做的工作?就给定问题提供尽可能多的信息会很有帮助,而且它还可以向其他人证明您在提出问题之前已经进行了一些尽职调查。

标签: linux perl system


【解决方案1】:

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

system "sleep 30 &";

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的链接。我认为这会有所帮助!
    【解决方案3】:

    由于发布日期,不打算成为双关语,但要小心僵尸! 这有点棘手,有关详细信息,请参阅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 不再属于进程组,因此即使杀死父进程也不会影响子进程。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-06-12
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-15
        • 2011-05-23
        相关资源
        最近更新 更多