2012-12-12 12 views
13

पर चल रहा है कैसे रोकूँ मैं इस प्रक्रिया (time.php) शुरू कर दियामैं एक PHP स्क्रिप्ट पृष्ठभूमि

<?php 

ignore_user_abort(true); // run script in background 
set_time_limit(0);  // run script forever 
$interval = 300;   // do every 1 minute... 
do 
{ 
    // add the script that has to be ran every 1 minute here 
    // ... 

    $to  = "[email protected]"; 
    $subject = "Hello Richie"; 
    $header = "From: [email protected]"; 
    $body = "Hello Richard,\n\n" 
      . "I was just testing this service\n\n " 
      . "Thanks! "; 

    mail($to, $subject, $body, $header); 

    sleep($interval); // wait 5 minutes 

} while(true); 
?> 

लेकिन मैं अब इसे रोकने के लिए चाहते हैं। यह मेरे जीमेल ए/सी में सैकड़ों मेल भेज रहा है। यह एक वेब सर्वर पर है जहां मैं प्रक्रिया को मारने के लिए इसे पुनरारंभ नहीं कर सकता।

क्या प्रक्रिया को मारने के लिए कोई अन्य फ़ाइल निष्पादित करने का कोई तरीका है, या मैं कैसे जा सकता हूं?

+9

:

sudo service apache2 start 

बस अपाचे फिर से शुरू करने के लिए लाइन 'मार '। और अगली बार शुरू न करें जो आपको नहीं पता कि –

+0

को कैसे रोकें? क्या आपका होस्ट आपको कंसोल (एसएसएच) तक पहुंच प्रदान करता है? –

+5

'ignore_user_abort (सत्य);' + 'जबकि (सत्य);' + 'मेल' = 'बहुत बुरा' – Baba

उत्तर

0

आप अपाचे प्रक्रिया को चला सकते हैं। बैक अप शुरू करने के लिए apachectl stop और फिर apachectl start जैसे कुछ चलाने का प्रयास करें। यह आपके सर्वर को समय के लिए मार देगा लेकिन यह भी सुनिश्चित करेगा कि उस स्क्रिप्ट पर फंसे किसी भी प्रक्रिया को दूर कर दिया जाएगा।

4

यदि आपने इसे पीआईडी ​​प्राप्त करने के लिए पृष्ठभूमि उपयोग ps aux | grep time.php में प्रारंभ किया है। फिर बस kill PID। अगर प्रक्रिया अग्रभूमि में शुरू हुई है, तो इसे बाधित करने के लिए उपयोग करें।

यदि प्रक्रिया अपाचे के भीतर शुरू हुई, तो अपाचे (/etc/init.d/apache2 डेबियन के लिए पुनरारंभ करें) को पुनरारंभ करें। अगर प्रक्रिया CGI- जैसे सर्वर से शुरू हुई है, तो सर्वर को पुनरारंभ करें।

7

मुझे लगता है कि आपके पास खोल पहुंच नहीं है। मुझे संदेह है कि व्यवस्थापक से संपर्क करना सबसे आसान तरीका है और उन्हें अपाचे को पुनरारंभ करना है। वे नहीं चाहते हैं कि यह आपके से आगे चल रहा हो।

एक विकल्प PHP का उपयोग करके सभी अपाचे प्रक्रियाओं को मारने का प्रयास करेगा। यह सभी अपाचे प्रक्रियाओं के लिए एक हत्या संकेत भेज देगा, सिवाय इसके कि वह नीचे चल रहा है। यह काम कर सकता है अगर Apache प्रक्रिया setuid() के बिना साझा प्रक्रिया के तहत चल रही है। अपने जोखिम पर प्रयास करें।

<?php 
$cpid = posix_getpid(); 
exec("ps aux | grep -v grep | grep apache", $psOutput); 
if (count($psOutput) > 0) 
{ 
    foreach ($psOutput as $ps) 
    { 
     $ps = preg_split('/ +/', $ps); 
     $pid = $ps[1]; 

     if($pid != $cpid) 
     { 
      $result = posix_kill($pid, 9); 
     } 
    } 
} 
?> 
+0

बिल्कुल सही जवाब, हालांकि यह नहीं बताया गया कि मेरी स्क्रिप्ट अलग-अलग आईडी के साथ चल रही है, इसलिए मैंने अलग-अलग आईडी के साथ चल रहा था और कुछ लोगों को छोड़कर, वे कुछ दोहराने वाले आईडी वापस लौट रहे थे, इसलिए उनमें से एक को मारना पड़ा। – Abubakkar

19

यदि आपके पास खोल पहुंच नहीं है, तो सर्वर प्रशासक को प्रक्रिया को मारने के लिए एकमात्र तरीका यह है कि एकमात्र तरीका है।

<?php 
// at start of script, create a cancelation file 

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','run'); 

// inside the script loop, for each iteration, check the file 

if (file_get_contents(sys_get_temp_dir().'/myscriptcancelfile') != 'run') { 
    exit('Script was canceled') ; 
} 

// optional cleanup/remove file after the completion of the loop 

unlink(sys_get_temp_dir().'/myscriptcancelfile'); 

// To cancel/exit the loop from any other script on the same server 

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','stop'); 

?> 
+0

क्या आप रद्दीकरण फ़ाइल द्वारा अपना मतलब समझ सकते हैं, मेरे पास एक समान प्रोबम – Abubakkar

+0

file_put_contents() PHP/tmp फ़ोल्डर के अंदर "myscriptcancelfile" नाम की एक फ़ाइल रखता है, जो उस सर्वर पर वैश्विक PHP उपयोगकर्ता द्वारा लिखने योग्य है (कोई नाम हो सकता है "स्क्रिप्ट" की सामग्री के साथ आपकी स्क्रिप्ट के लिए विशिष्ट)। लूपिंग पुनरावृत्तियों के दौरान, file_get_contents() सामग्री की जांच करता है। यदि सामग्रियों को "रन" के अलावा किसी अन्य चीज़ में बदल दिया गया है (कहें, स्क्रिप्ट को रोकने के लिए), लूप निकलता है। लूप के बाद सफाई के लिए, आप अनलिंक कर सकते हैं ('/ tmp/myscriptcancelfile'); –

+0

शानदार! वास्तव में मुझे क्या चाहिए। –

2

अपने php स्क्रिप्ट रोक दिए करने के लिए:

कहा जा रहा है, वहाँ एक स्क्रिप्ट की स्थापना की और यह एक ही सर्वर पर किसी अन्य स्क्रिप्ट से रद्द किए जाने को सक्षम करने के लिए एक आसान तरीका, इस प्रकार है बस अपने टर्मिनल में निम्न आदेश दर्ज कर सकते हैं। यह अपाचे सेवा को पुनरारंभ करेगा। (अंतिम रूप से आपकी PHP सेवा को पुनरारंभ करना)।

sudo service apache2 restart 

आप भविष्य में अपनी स्क्रिप्ट के भीतर टाइमआउट शामिल करना चाह सकते हैं।

+1

मुझे नहीं पता कि आप इतने अपमानजनक क्यों हैं। स्टैक ओवरफ़्लो त्रुटियों को हल करने में सहायता के लिए एक खुला ऑनलाइन संसाधन है। मुझे 21 फरवरी को इस धागे में पोस्ट की गई एक ही त्रुटि में आया ... लेकिन मुझे इस विचार को साझा करने का आग्रह हुआ कि इसे प्रभावी ढंग से कैसे हल किया जा सकता है क्योंकि मैंने इसे अलग-अलग हल किया था। मुझे उम्मीद है कि मैं आपसे फिर से या आपकी घमंडी टिप्पणियां नहीं आऊंगा। ... यह मुझे परेशान करता है कि आप मेरे उत्तर को नीचे वोट देंगे (जिस तरह से काम करता है) और इस तरह की एक हानिकारक टिप्पणी छोड़ दें। इस पृष्ठ पर पूछे जाने वाले प्रश्न और मूल आगंतुक दोनों के लिए उत्तर दिया गया प्रश्न उत्तर दिया गया है। –

+0

मुझे खेद है। प्रश्न संपादित करें ताकि मैं इसे ऊपर उठा सकूं। :) – Richie

5

निम्नलिखित पृष्ठभूमि प्रक्रिया (PHP) बंद हो जाएगा:

sudo service apache2 stop 

अपाचे फिर से शुरू करने के लिए: आदेश से

sudo service apache2 start 
संबंधित मुद्दे