我有一个类似的脚本:
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
是空的。
怎么了?
答案 0 :(得分:6)
.pid文件为空,因为执行脚本的shell会替换$!
,而不是shell执行您通过su
传递的命令。由于您的脚本中最近没有启动后台命令,因此它会替换空字符串。因此,su
启动的shell只执行echo > /var/php-nginx/biergaizi.test.php.pid
。
为防止这种情况,请使用单引号而不是双引号引用传递给su
的命令。最好对“stop”命令执行此操作。像这样:
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。
答案 1 :(得分:1)
试试这个:
在转到$
之前,从$!
退出su -c
。