Init.d脚本挂起

我有一个init.d脚本,如下所示:

#!/bin/bash # chkconfig 345 85 60 # description: startup script for swapi # processname: swapi LDIR=/var/www/html/private/daemon EXEC=swapi.php PIDF=/var/run/swapi.pid IEXE=/etc/init.d/swapi ### BEGIN INIT INFO # Provides: swapi # Required-Start: $local_fs # Required-Stop: # Default-Start: 3 4 5 # Default-Stop: 0 1 2 6 # Short-Description: startup script for swapi # Description: startup script for swapi.php which processes actionq into switch ### END INIT INFO if [ ! -f $LDIR/$EXEC ] then echo "swapi was not found at $LDIR/$EXEC" exit fi case "$1" in start) if [ -f $PIDF ] then echo "swapi is currently running. Killing running process..." $IEXE stop fi $LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$! echo $MYPID > $PIDF echo "swapi is now running." ;; stop) if [ -f $PIDF ] then echo "Stopping swapi." PID_2=`cat $PIDF` if [ ! -z "`ps -f -p $PID_2 | grep -v grep | grep 'swapi'`" ] then kill -9 $PID_2 fi rm -f $PIDF else echo "swapi is not running, cannot stop it. Aborting now..." fi ;; force-reload|restart) $0 stop $0 start ;; *) echo "Use: /etc/init.d/swapi {start|stop|restart|force-reload}" exit 1 esac 

然后我有一个keepalive cronjob,如果pid发生故障,就会调用它。 问题是keepalive脚本每当我运行它像一个cron作业(即运行部分/ var / www / html /私人/五分钟),(Keepalive脚本在/ var / www / html /私人/五分钟) 。

在我的init.d脚本中是否有一些我很想念的东西?

我已经在这个问题上花费了好几个小时了! 我在上btw。

谢谢你的帮助。 -Eric

编辑:

Keepalive / cronjob脚本被简化为testing一个简单的:

 #!/usr/bin/php <? exec("/etc/init.d/swapi start"); ?> 

奇怪的是这是从swapi.php的错误输出被放到/ var / spool / mail像普通的cron输出,除了我有所有的输出被转储到init.d脚本中的swapi.log?

当我从cli运行keepalive.php(来自/的root),它的运行方式与我所期望的完全一样。

当keepalive运行ps aux |时 grep的PHP看起来像:

 root 4525 0.0 0.0 5416 584 ? S 15:10 0:00 awk -v progname=/var/www/html/private/fivemin/keepalive.php progname {????? print progname ":\n"????? progname="";???? }???? { print; } root 4527 0.7 1.4 65184 14264 ? S 15:10 0:00 /usr/bin/php /var/www/html/private/daemon/swapi.php 

如果我做一个:

 /etc/init.d/swapi stop 

从cli那么这两个程序不再列出。

Swapi ls -l看起来像:

 -rwxr-xr-x 1 5500 5500 33148 Aug 29 15:07 swapi.php 

这是crontab的样子:

 */5 * * * * root run-parts /var/www/html/private/fivemin 

这是swapi.php的第一位

 #!/usr/bin/php <? chdir(dirname( __FILE__ )); include("../../config/db.php"); include("../../config/sql.php"); include("../../config/config.php"); include("config_local.php"); include("../../config/msg.php"); include("../../include/functions.php"); set_time_limit(0); echo "starting @ ".date("Ymd.Gi")."...\n"; $actionstr = ""; while(TRUE){ 

我修改了init.d脚本,并把init放在variables声明的上面,但是没有什么区别。

答案是bash保持打开状态,因为我的init.d脚本没有重定向stderr输出。 我现在已经改变了

 $LDIR/$EXEC &> $LDIR/swapi.log & MYPID=$! 

现在它功能完美。

感谢大家的帮助!

当你从cron运行一个命令时,这个环境和登录后从bash命令行运行的环境是不一样的。在这种情况下,我会怀疑sh不能把swapi.php理解为一个PHP命令。

做一个

 which php 

看你的php二进制文件是什么,并将其添加到你的init.d脚本

 PHP=/usr/bin/php ... $PHP $LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$! 

可能不是那么重要,但是你可能想重定向cron行的输出

 0 * * * * /path/to/script 2>&1 >> /dev/null 

例如。

确保您的脚本具有正确的执行权限,正确的所有者,并且第一行应该如下所示:

 #!/usr/bin/php <?php