2010-08-28 107 views
3

我有一个脚本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 

然后,我有一个存活的cronjob调用此如果PID下降。问题在于,只要我像cron作业那样运行keepalive脚本(例如,run-parts/var/www/html/private/5min),(keepalive脚本位于/ var/www/html/private/5min) 。

在我的init.d脚本中是否存在某些我不知道的东西?

我一直在这个问题上绞尽脑汁,几个小时了!我在centos4 btw。

感谢您的任何帮助。 -Eric

编辑:

保活/的cronjob脚本简化测试,以一个简单的:

#!/usr/bin/php 
<? 

exec("/etc/init.d/swapi start"); 

?> 

奇怪,这是从swapi.php输出误差投入的/ var /假脱机/邮件像正常的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 

,如果我做了:从CLI

/etc/init.d/swapi stop 

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

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放在变量声明之上,但没有什么区别。

+0

请显示使用cron作业条目,以及swapi.php的头文件和它拥有的权限(swapi.php目录中的'ls -l')。 – polemon 2010-08-28 07:03:54

+0

另外,尝试从控制台手动运行您的init脚本几次,您通常会在那里遇到问题。只要确保您使用的条件与被称为cron作业(用户,权限,shell等)的条件完全相同。 – polemon 2010-08-28 07:08:00

+0

在执行kill -9之前,您应该尝试'kill -15'。有关示例,请参阅'/ etc/init.d'中的其他脚本。它可能没有任何区别,但是你应该将INIT节移动到变量定义之上。如果你正在做'ps -p',我认为你不需要'grep -v grep'(grep'swapi''可能不是必需的,但它可以作为完整性检查)。你真的需要展示你的Keepalive脚本和它的cron条目。 – 2010-08-28 15:00:48

回答

5

答案是bash的是保持开放,因为我的init.d脚本没有重定向stderr输出。我现在已将其更改为

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

现在它功能完好。

感谢大家的帮助!

0

当您从cron运行一个命令,环境是不一样的,当它从bash命令行登录后运行的。我怀疑在这种情况下,该sh是无法理解swapi.php作为PHP命令。

做一个

which php 

,看看你的php二进制文件,并添加到您的初始化。d脚本

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

也许并不重要,但你可能要到输出从cron线

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

例如重定向。

+0

如果php解释器不能被找到,那么脚本就会抛出一个错误,而不会卡住。 – polemon 2010-08-28 07:16:19

+0

PHP脚本将由shell解释,而不是由php解释器解释。如果'<'(PHP脚本的第一个字符通常用于'<?php')被shell解释,而不是驱动到php解释器,它很可能会挂起。这可能是php脚本中的另一个词 - 但cron无论如何不太可能调用php解释器,并且在这样的脚本中很可能使用PHP正确解释的行将不会被shell以相同的方式理解,并可能导致过程挂起。 – 2010-08-28 07:31:04

+0

我们能否看到swapi.php脚本更好地了解shell被解释时会发生什么? – 2010-08-28 07:38:53

0

确保您的脚本有正确执行权限,权利人,和第一线应该是这样的:

#!/usr/bin/php 
<?php