-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

これは機能しています。しかし、スクリプトが多すぎる\ため、コードが読めなくなります。そこで、新しいシェル スクリプトを作成しました。

#!/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、空です。

どうしたの?

4

2 に答える 2

6

$!渡すコマンドを実行するシェルではなく、スクリプトを実行するシェルに置き換えられるため、.pid ファイルは空ですsu。また、スクリプトには最近開始されたバックグラウンド コマンドがないため、空の文字列に置き換えられます。したがって、によって開始されたシェル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を参照してください。

于 2013-05-15T10:33:36.433 に答える
1

これを試して:

に渡す前に、$からエスケープします。$!su -c

于 2013-05-15T10:34:13.970 に答える