2013-05-15 76 views
-1

我有一個這樣的腳本:

su lingcat -c PHPRC\=\/home\/lingcat\/etc\/php5\ 
PHP_FCGI_CHILDREN\=4\ \/usr\/bin\/php\-loop\.pl\ \/usr\/bin\/php5\-cgi\ \-b\ 
127\.0\.0\.1\:9006\ \>\>\/home\/lingcat\/logs\/php\.log\ 2\>\&1\ \<\/dev\/null\ \&\ 
echo\ \$\!\ \>\/var\/php\-nginx\/135488849520817\.php\.pid 

這是工作。但腳本中有太多的\,它們使代碼不可讀。所以,我寫了一個新的shell腳本:

#!/bin/sh 
case "$1" in 
'start') 
     su biergaizi -c "PHPRC=/home/biergaizi/etc/php5 PHP_FCGI_CHILDREN=2 
/usr/bin/php-loop.pl /usr/bin/php-cgi -b /var/run/virtualhost/php5-fpm-biergaizi.test.sock >>/home/biergaizi/logs/php.log 2>&1 </dev/null & 
echo $! > /var/php-nginx/biergaizi.test.php.pid" 
     RETVAL=$? 
     ;; 
'stop') 
     su biergaizi -c "kill `cat /var/php-nginx/biergaizi.test.php.pid` ; sleep 1" 
     RETVAL=$? 
     ;; 
'restart') 
     $0 stop ; $0 start 
     RETVAL=$? 
     ;; 
*) 
     echo "Usage: $0 { start | stop }" 
     RETVAL=1 
     ;; 
esac 
exit 

但是/var/php-nginx/biergaizi.test.php.pid是空的。

怎麼了?

+1

哇!從什麼時候開始你需要避開前鋒?你聽說過報價嗎?您可能會發現「作業-p%1」在bash中的作用不僅僅是「$!」用於獲取後臺進程的pid。 –

+0

這個問題是類似的http://stackoverflow.com/questions/16542417/bash-get-pid-of-a-process-using-a-diferent-user/16542582#16542582 – anishsane

+0

@Nicholas威爾遜我從來沒有逃過一個前瞻性的,斜槓,但自動腳本生成器。 –

回答

6

.pid文件爲空,因爲$!被執行腳本的shell取代,而不是執行通過su傳遞的命令的shell。由於腳本中沒有最近啓動的後臺命令,因此將替換爲空字符串。因此,由su啓動的外殼只執行echo > /var/php-nginx/biergaizi.test.php.pid

爲防止出現這種情況,請使用單引號將您的命令傳遞給su而不是雙引號。對「停止」命令也是這樣做的。就像這樣:

su biergaizi -c 'PHPRC=/home/biergaizi/etc/php5 PHP_FCGI_CHILDREN=2 
       /usr/bin/php-loop.pl /usr/bin/php-cgi -b /var/run/virtualhost/php5-fpm-biergaizi.test.sock >>/home/biergaizi/logs/php.log 2>&1 </dev/null & 
       echo $! > /var/php-nginx/biergaizi.test.php.pid' 

這:

su biergaizi -c 'kill `cat /var/php-nginx/biergaizi.test.php.pid` ; sleep 1' 

http://www.gnu.org/software/bash/manual/html_node/Quoting.html瞭解詳情。

+0

謝謝。我知道'$!'是問題的根源。我試圖通過'\ $ \!'逃避它,但沒有成功(我知道爲什麼,現在)使用單引號是一種更優雅的方式。 –

1

試試這個:

逃生$$!,傳遞給su -c之前。

+0

謝謝。事實上,我試過'\ $ \!'...... –

相關問題