2012-12-21 223 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不屬於進程的組了,所以甚至殺害父進程將不會影響孩子。