2012-06-30 16 views
10

में नहीं चला है, तो मैं यह जानना चाहता हूं कि प्रोग्राम चल रहा है या नहीं, तो इस प्रोग्राम को कैसे चलाएं।जांचें कि क्या प्रोग्राम चल रहा है और अगर इसे

+0

कौन सा ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं? –

+0

डेबियन 6, लेकिन सवाल हल हो गया है। – Luke

उत्तर

7

प्रक्रिया आईडी को 0 (शून्य) सिग्नल भेजें जिसे आप हत्या कार्य का उपयोग करके जांचना चाहते हैं। यदि प्रक्रिया मौजूद है, तो फ़ंक्शन सत्य लौटाता है, अन्यथा यह झूठा रिटर्न देता है।

उदाहरण:

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

आप आप एक सिस्टम कॉल का उपयोग कर कमांड लाइन से होता है जैसे किसी भी कार्यक्रम कॉल कर सकते हैं। यह केवल तभी उपयोगी होता है जब आपको प्रोग्राम के आउटपुट को कैप्चर करने की आवश्यकता न हो।

#!/usr/bin/perl 
use strict; 
use warnings; 
my $status = system("vi fred.txt"); 

या आप खोल शामिल नहीं करना चाहते हैं:

#!/usr/bin/perl 
use strict; 
use warnings; 
my $status = system("vi", "fred.txt"); 
+1

ठीक है, लेकिन यह जांचने के लिए कि क्या उसके नाम से प्रक्रिया चल रही है? : डी – Luke

+1

http://search.cpan.org/~durist/Proc-ProcessTable-0.39/ProcessTable.pm मुझे पता नहीं है कि कैसे perl के साथ, लेकिन यह मुझे यकीन है कि आप जो खोज रहे हैं। – Sturm

+3

यह भी देखें http://stackoverflow.com/questions/3844168/how-can-i-check-if-a-unix-process-is-running-in-perl – Bruce

4

एक और जवाब देने के लिए इसी तरह की है, लेकिन आप यह सुनिश्चित कर लें और प्रयोग "grep -v grep" करने के लिए ग्रेप से मेल नहीं करने की आवश्यकता है खुद को बुलाओ यह सुनिश्चित करेगा कि आप सही नहीं होने पर मूल्यांकन कर रहे हैं जब आप नहीं चाहते हैं।

use strict; 
use warnings; 

my($cmd, $process_name) = ("command here", "process name here"); 

if(`ps -aef | grep -v grep $process_name`) { 
    print "Process is running!\n"; 
}#if 
else { 
    `$cmd &`; 
}#else 
+0

यह उत्तर केवल * nix पर काम करता है। निर्मित कमांड और सीपीएएन मॉड्यूल का उपयोग करने के मुख्य बिंदुओं में से एक ज्यादातर मामलों में पोर्टेबिलिटी के बारे में चिंता करने की ज़रूरत नहीं है। 'मार 0, $ pid' विकल्प विंडोज़ की तरह अन्य ओएस पर काम करता है। :-) –

+0

मुझे लगता है कि आप केवल 'pgrep' का उपयोग कर सकते हैं, चल रही प्रक्रियाओं को grepping इतना आम है, इसके लिए एक विशेष आदेश है;) –

0

हम अगर एक डेमॉन चल रहा है, डेमॉन शुरू लिनक्स पर पीआईडी ​​फ़ाइल की सामग्री पर आधारित इस जांच करने के लिए उपयोग करें:

#!/usr/local/bin/perl 
use strict; 
use warnings; 

use feature qw/ say /; 

# vars we report 
my (
    $token,   # optional arg - check against cmd_line if specified 
    $pid_file,  # daemon pid-file, e.g. /var/run/mysqld/mysqld.pid 
    $pid,   # the pid to investigate... 
    $pid_running, # found a pid and it is running 
    $cmd_line,  # cmd_line of the running pid 
    $result,  # 0-OK, 1=FAIL, exit value 
    $error,   # error message if necessary 
); 

# working vars 
my ($fh, $cmd_file); 

die "Daemon pid-file required" unless scalar @ARGV >= 1; 
($pid_file, $token) = @ARGV; 

if (-s $pid_file) { 
    open($fh, "<", $pid_file) or die "open $pid_file: $!"; 
    ($pid) = <$fh>; chomp $pid; close $fh; 

    $pid_running = kill 0, $pid; 

    if ($pid_running) { 
    $cmd_file = "/proc/$pid/cmdline"; 
    local($/) = "\0"; # C-String NULL terminated 
    open($fh, "<", $cmd_file) or die "open $cmd_file: $!"; 
    ($cmd_line) = <$fh>; close $fh; 
    if ($cmd_line && $token && $cmd_line !~ m/$token/) { 
     $error = "token not found: $token in $cmd_line"; 
    } 
    } 
    else { 
    $error = "process not found: $pid"; 
    } 
} 
else { 
    $error = "file not found: $pid_file"; 
} 

# if TOKEN - OK running process with matching cmdline 
$result = $token ? ($pid_running && $cmd_line && $cmd_line =~ m/$token/) 
       : ($pid_running || 0); 

say "token:  ", $token if $token; 
say "file:  ", $pid_file; 
if ($pid) { 
    say "pid:  ", $pid; 
    say "running: ", $pid_running; 
    say "cmdline: ", $cmd_line if $cmd_line; 
} 
say "error:  ", $error if $error; 
say "exit:  ", $result ? 'ok' : 'fail'; 

exit $result; 
3

मैंने कोशिश की "मारने 0 ..." बात है, लेकिन यदि आपके पास प्रक्रिया को अनुमति नहीं है, तो यह काम नहीं करेगा, क्योंकि "0 मारें" केवल सिग्नल भेजने के लिए संभव है या नहीं। चूंकि आपके पास इसकी कोई अनुमति नहीं है (आपका यूआईडी 0 नहीं है और प्रक्रिया यूआईडी नहीं है), आप हमेशा झूठी रहेंगे।

मैंने लिनक्स में खाते/proc/को ले जाने की कोशिश की ताकि यह जांच सके कि पीआईडी ​​निर्देशिका वहां है या नहीं, लेकिन वह हिस्सा बहुत पोर्टेबल नहीं है: लिनक्स के लिए अच्छा है, लेकिन वास्तव में यूनिक्स में कहीं और काम नहीं करेगा अतिरिक्त प्यार

sub is_running() { 
    my $pid = shift; 
    my @proc_data = split(/\s+:\s+/, 
          `ps uax | awk '{print \$1,":",\$2}' | grep $pid`); 
    return (@proc_data && $proc_data[1] == $pid) ? $proc_data[0] : undef; 
} 

प्रयोग, सरल और सुंदर उपयोगी है क्योंकि यह आपको भी रिटर्न प्रक्रिया के मालिक:

my $pid = 12345; 
my $owner = &is_running($pid); 
if ($owner) { 
    print "Process with PID $pid is running and owned by \"$owner\".\n"; 
} 

मज़े

तो मैं इस उप HTH लिखा था,! :)

1

तो $pid खाली है, प्रक्रिया नहीं चल रही है:

my $pid = `ps -C $progname -o pid=`; # non-windows solution, sorry 
संबंधित मुद्दे