2012-03-26 10 views
30

Belirtilen bir işlemin PHP üzerinden çalışıp çalışmadığını kontrol etmek istiyoruz.Belirtilen PID'nin PHP'den ps'yi çağırmadan halihazırda çalışıp çalışmadığını nasıl kontrol edebilirim?

Sadece bir PID sağlamak ve şu anda çalışıp çalışmadığını görmek istiyoruz.

PHP'nin bu bilgiyi veren bir dahili işlevi var mı yoksa "ps" çıkışından ayrıştırmamız mı gerekiyor?

+1

Bu, PHP'nin bunu yapmak için bir işlevi olmasını istediğim gibi gelmiyor. Bu yüzden dışsal şeylere başvurmanız gerektiğini düşünüyorum. – PeeHaa

+0

@PeeHaa Sadece bir dilde istediğiniz bir şey gibi gelmediği için bir dilde cevap vermiyorsa, yorumunuz hiç de yapıcı değildir. – Stonestorm

cevap

58

kullanarak bir bash betiği çağırır, şunu deneyin:

if (file_exists("/proc/$pid")){ 
    //process with a pid = $pid is running 
} 
+1

gibi diğer alanlarla eşleşecek, muhtemelen bu şekilde yapmanın en iyi yolu bu şekilde düşünmedim. –

+1

evet bu oldukça temiz. güzel bitti! –

+5

LÜTFEN DİKKAT: Aslında is_dir/proc/PID bir dizin değil, bir dosya değil. –

3

Sana Linux üzerinde iseniz shell_exec

$pid = 23818; 
if (shell_exec("ps aux | grep " . $pid . " | wc -l") > 0) 
{ 
    // do something 
} 
+0

, bu şekilde bir şeyler yapmanın biraz daha temiz olmasını sağlar: http://stackoverflow.com/questions/5207013/bash-check-if-pid-exists –

+1

Tüm bunların tümünü backticks'e yazabilirsiniz: $ result = 'ps aux | grep | wc -l'; Bir betikle tahmin etsem de, erişim üzerinde daha fazla kontrole sahip olmanıza rağmen –

+0

Ben, OP'den PHP'den temin edilen belirli bir PID'yi kontrol etmek istediğim için cevabımı güncelledim. –

29

posix_getpgid($pid); return false olacak bir süreç

+2

Bu, amaçlarım için çalışır - kilit komut tablosunda bir pid varken aynı betiğin çalışmasını engelleyen bir kilit ayarlama. Teşekkürler. – dgig

11

ise çalışmadığı zamanlarda o zaman bunun için bir işleviniz olsun:

$running = posix_kill($pid,0); 

Sinyal tanıtıcısını işlem tanıtıcısı pid ile işleme gönderin. Aksi işlem çalışıyorsa true dönecektir 0 öldürme sinyali ile posix_kill çağırma

, false.

+0

Bu, kullanıcının erişim hakkına sahip olmadığı işlemler için çalışmaz (örn. "Root" olarak çalışan bir sunucu, betiği çalıştıran kullanıcı "www-data") (https://stackoverflow.com/a/15774758 adresine bakın)./593868) – webmaster777

0

i oyun-sunucu durumunu göstermek için wordpress kullanarak im bunun için bir komut dosyası, yapmış, ancak bu sunucuya

<?php 
 
//########################################## 
 
// desc: Diese PHP Script zeig euch ob ein Prozess läuft oder nicht 
 
// autor: seevenup 
 
// version: 0.2 
 
//########################################## 
 

 
if (!function_exists('server_status')) { 
 
     function server_status($string,$name) { 
 
       $pid=exec("pidof $name"); 
 
       exec("ps -p $pid", $output); 
 

 
       if (count($output) > 1) { 
 
         echo "$string: <font color='green'><b>RUNNING</b></font><br>"; 
 
       } 
 
       else { 
 
         echo "$string: <font color='red'><b>DOWN</b></font><br>"; 
 
       } 
 
     } 
 
} 
 

 
//Beispiel "Text zum anzeigen", "Prozess Name auf dem Server" 
 
server_status("Running With Rifles","rwr_server"); 
 
server_status("Starbound","starbound_server"); 
 
server_status("Minecraft","minecarf"); 
 
?>

fazla bilgi üzerinde çalışan tüm süreci ile çalışacak burada bence http://umbru.ch/?p=328

0
//For Linux 
$pid='475678'; 
exec('ps -C php -o pid', $a); 
if(in_array($pid, $a)){ 
    // do something... 
} 
+0

Yığın Taşmasına Hoş Geldiniz! Bu kod pasajı [bir açıklama dahil] [// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers] sorusunu çözebilirken, yayınınızın kalitesini artırmanıza yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerilerinizin nedenini bilmeyebileceğini unutmayın. Ayrıca, kodunuzu açıklayıcı yorumlar ile doldurmamaya çalışın, çünkü bu hem kodun hem de açıklamaların okunabilirliğini azaltır! – FrankerZ

1

posix_kill(posix_getpgrp(), 0) PID Kaçmanın olup olmadığını kontrol etmenin en iyi yoludur g, sadece Windows platformlarında mevcut değildir.

Bu, kabukta kill -0 PID ve PHP'de shell_exec('kill -0 PID') ile aynıdır ancak pid olmadığında HATASIZ çıkış yok.

çatallı alt süreçte, posix_getpgid, üst öğenin sonlandırılmasa bile üst öğenin pidini döndürür.

<?php 

$pid = pcntl_fork(); 

if ($pid === -1) { 
    exit(-1); 
} elseif ($pid === 0) { 
    echo "in child\n"; 
    while (true) { 
     $pid = posix_getpid(); 
     $pgid = posix_getpgid($pid); 
     echo "pid: $pid\tpgid: $pgid\n"; 
     sleep(5); 
    } 
} else { 
    $pid = posix_getpid(); 
    echo "parent process pid: $pid\n"; 
    exit("parent process exit.\n"); 
} 
İlgili konular