2010-10-02 75 views
3

在UNIX中,我正在通過執行以下命令來檢查進程是否已啓動;如何檢查Unix進程是否在Perl中運行?

E.g.

psg dtllst pe99 

如果進程正在運行,則返回以下輸出;

UID PID PPID C STIME TTY TIME CMD 
pe99 1234 1  0 03:29:44 pts/8 0:01 dtllst pe99 

現在在Perl中,我想能夠找出這個過程是否啓動。到目前爲止,我做了以下

`my $checkProc = `psg dttlst | grep $myNode 2>&1`;` #where $myNode is something like pe01 or pe02 or pe65 or pe99 etc... 

在此之後現在我做以下,看看上面的Perl命令已經回到我所期待的,看看這個過程是向上;

if ($checkProc =~ m/dtllst $myNode | $myNode/) { 
    #yes, process is up 
} else { 
    #no, process is down 
} 

但是這不起作用 - 具體地說,無論UNIX進程是否存在,我的代碼總是評估if語句爲true。我知道這是錯誤的。 我試圖逃避正則表達式中的「$」字符,看看是否是這個問題,我也嘗試從正則表達式中刪除Perl變量。

我在這裏錯過了什麼?我知道我的正則表達式是錯誤的地方:(

感謝

+2

我們不知道你的'psg'別名或shell函數是什麼。我們看到你的''$ checkProc = ...'行中有反引號,這可能是一個語法錯誤。我們看到你將'psg'管入'grep'中,如果'psg'已經是包含grep的別名,這對我沒有任何意義。重要的是,我們不知道'$ checkProc'和'$ myNode'的內容 - 如果'$ myNode'爲空,那麼你的正則表達式將會匹配任何一個空格字符,這可以解釋你的症狀。 – pilcrow 2010-10-02 14:00:36

回答

1

添加到@ zigdon的回答是:

比方說你$myNodefoo,你的正則表達式將/dtllst foo | foo/

現在這個搜索字符串'dtllst foo '' foo' in $checkProc

請注意,在'foo'之後之後有一個空格。該字符串唯一可以找到的地方是最後一列CMD,但尾隨空格將導致匹配失敗。

另外你的替代品' foo'也有一個空間。如果找到該過程的唯一方法是搜索'dtllst foo',則不需要此替代方案,因爲此替代方案也將匹配'foo'作爲其他命令的參數運行。

而正則表達式是:

if ($checkProc =~ m/dtllst $myNode/) { 
6

你也許匹配grep的進程?您始終可以添加| grep -v grep以確保您正在篩選ps輸出中的那條線。

9

您可以使用Proc::ProcessTable來避免必須啓動外部命令並解析其輸出。類似於

use Proc::ProcessTable; 
... 
my $t = Proc::ProcessTable->new; 
my $is_running = grep { $_->{cmndline} =~ /^dtllst $myNode/ } @{$t->table}; 
1

我想我知道爲什麼會這樣發生。您的代碼始終評估爲true,因爲帶有您正在使用的模式的psg命令也會出現在從Perl腳本中調用該命令時psg命令輸出的進程列表中。如果不在if條件中執行匹配以確定進程是否正在運行,則可能需要保留匹配計數,並在匹配計數超過1時處理與匹配模式的進程正在運行。以下是我使用的一段代碼:

my $match_count = 0; 
my $processes = `ps x`; 
while($processes =~ m/(.*?)\n/sg) 
{ 
    my $process = $1; 
    chomp($process); 
    if($process =~ m/$pattern/) 
    { 
     #print "$process matched $pattern \n"; 
     $match_count++; 
    } 
} 

if($match_count > 1) 
{ 
    print "The process is running"; 
} 
3

你可以使用kill命令,似乎是一種更乾淨的方式;

#!/usr/bin/perl 

#-- check if process 11325 is running 
$exists = kill 0, 11325; 
print "Process is running\n" if ($exists); 
+0

不錯的純perl版本。謝謝! – 2016-12-08 15:12:39

+1

注意:這隻有在你可以殺死進程(你是它的主人或你是root)時纔有效。 – 2017-02-28 03:08:03

相關問題