2011-03-13 20 views
6

मैं पृष्ठभूमि में PHP प्रक्रियाओं को चलाने की कोशिश करता हूं और इसे एक php फ़ाइल से शुरू करता हूं।nohup: पृष्ठभूमि में PHP प्रक्रिया चलाएं

कुछ सूचनाएं: PHP संस्करण 5.2.17, php safe_mode बंद है, लिनक्स सिस्टम। मैं exec के साथ प्रक्रिया शुरू करता हूं, पहले से ही shell_exec कोशिश की। मैं 0755 के लिए सभी फ़ाइलों को निर्धारित करते हैं, 0777.

$pid = exec("nohup $cmd > /dev/null 2> /dev/null & echo $!"); 

तो मैं इस बयान प्रिंट, मैं इस मिलता है और पीआईडी ​​ठीक है:

nohup /usr/local/bin/php5 /.../../file.php > /dev/null 2> /dev/null & echo $! 

तो मैं

top 
साथ ssh के तहत प्रक्रियाओं के लिए देखो

मैं सही पीआईडी ​​के साथ मेरी php5 प्रक्रिया देखता हूं। उपयोगकर्ता जड़

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                      
3533 xxxxxxxx 20 0 21356 8868 4580 S 0 0.4 0:00.13 php5                       
3536 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3539 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3542 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3545 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3548 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3551 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5  

है अगर मैं प्रक्रिया मैनुअल शीर्ष इस तरह दिखता है शुरू:

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
8141 xxxxxxxx 22 2 24048 9.9m 5344 S 10 0.5 0:00.31 php5 

समस्या: यह कुछ भी नहीं happens.To डिबग एक छोटा सा मैं में एक उत्पादन लिखा था की तरह लगता है फ़ाइल

ob_start(); 
echo "STARTING..."; 
writeLog(ob_get_contents()); 
//... 
function writeLog($info){ 
    $handle = fopen("file.log", "a+"); 
    fwrite($handle, $info); 
    fclose($handle); 
} 
exit; 

मेरी फ़ाइल में कोई लॉग नहीं है। अगर मैं अपने ब्राउज़र में यह फ़ाइल शुरू करता हूं, तो यह सही ढंग से प्रक्रिया करता है और "डीबगिंग" जानकारी के साथ मेरी file.log प्राप्त करता है।

यह ब्राउज़र में क्यों काम कर रहा है और exec/shell_exec कमांड पर नहीं ?? मेरे पास सही पीआईडी ​​के साथ वास्तव में इन PHP प्रक्रियाएं हैं, लेकिन कोई परिणाम नहीं है।

धन्यवाद मदद के लिए बहुत कुछ!

+0

आपको पहले उस स्क्रिप्ट के लिए एक पूर्ण पथ प्रदान करने का प्रयास करना चाहिए जिसे आप निष्पादित करने का प्रयास कर रहे हैं, न कि एक रिश्तेदार जैसा कि आप अब ऐसा कर रहे हैं। अर्थात। 'नोहुप/usr/local/bin/php5 /absolute/path/to/file.php>/dev/null 2>/dev/null और echo $ का उपयोग करें!' – wimvds

+0

मेरे पास इस फ़ाइल का पूर्ण पथ है। मैं एसएसएच में प्रत्येक निर्देशिका से यह नोहप शुरू कर सकता हूं। यह काम कर रहा है। दुर्भाग्य से php के साथ नहीं। – stoe

+0

फिर यह एक अनुमति समस्या हो सकती है। तो अपने लॉग (अपाचे, PHP त्रुटि लॉग, कंसोल लॉग) की जांच करें ... यदि आप AppArmor/SELinux चला रहे हैं तो परीक्षण करने के लिए इसे बंद करने का प्रयास करें यदि आपको इन पृष्ठभूमि कार्यों को अनुमति देने के लिए अपनी सुरक्षा नीति को बदलने की आवश्यकता है। – wimvds

उत्तर

1

PHP सीएलआई पर्यावरण वेब वातावरण से भिन्न हो सकता है (mod_php, FCGI, जो भी हो)। कमांडलाइन से चलने पर त्रुटि के साथ एक स्क्रिप्ट के लिए मरना पूरी तरह से संभव है और जब आप इसे वेबसर्वर के माध्यम से नहीं बुलाते हैं। अपनी स्क्रिप्ट डीबग करें। यदि आप कर सकते हैं, एसएसएच आपके सर्वर में, वेबसर्वर उपयोगकर्ता के लिए su और कमांडलाइन से स्क्रिप्ट चलाएं।

यदि आप ऐसा नहीं कर सकते हैं, तो अपना खुद का विकास सर्वर स्थापित करें जहां आप यह कर सकते हैं (यदि आप कुछ लिनक्स जानते हैं तो यह मुश्किल नहीं है)।

0

संभावित अनुमति समस्या को छोड़कर, एक समान उत्तर यहां पोस्ट किया गया है - https://stackoverflow.com/a/22705727/3471333

nohup /usr/local/bin/php5 /.../../file.php </dev/null 2> /dev/null & echo $! 
संबंधित मुद्दे