首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Init.d脚本挂起

Init.d脚本挂起
EN

Stack Overflow用户
提问于 2010-08-28 14:54:56
回答 3查看 5.2K关注 0票数 3

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

代码语言:javascript
复制
#!/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下降,它就会调用它。问题是,当我像cron作业一样运行保持连接脚本时,它就挂起(即run-part /var/www/html/private/fivemin),( keepalive脚本在/var/www/html/private/fivemin中)。

是不是我的init.d脚本中有什么不对劲的地方?

我已经在这个问题上绞尽脑汁好几个小时了!我在centos4 btw上。

谢谢你的帮助。-Eric

编辑:

为了测试,keepalive/cronjob脚本被简化为一个简单的:

代码语言:javascript
复制
#!/usr/bin/php
<?

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

?>

奇怪的是,swapi.php的错误输出被放到/var/spool/mail中,就像正常的cron输出一样,除了我将所有输出都转储到init.d脚本中的swapi.log中?

当我从cli运行keepalive.php (作为/的根用户)时,它的操作完全符合我的预期。

当keepalive运行ps aux | grep php时,如下所示:

代码语言:javascript
复制
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

如果我这样做:

代码语言:javascript
复制
/etc/init.d/swapi stop

从cli中,两个程序都不再列出。

Swapi ls -l看起来像这样:

代码语言:javascript
复制
-rwxr-xr-x  1 5500 5500 33148 Aug 29 15:07 swapi.php

下面是crontab的外观:

代码语言:javascript
复制
*/5 * * * * root run-parts /var/www/html/private/fivemin

这是swapi.php的第一部分

代码语言:javascript
复制
#!/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放在变量声明的上方,这没有什么不同。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-20 23:44:00

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

代码语言:javascript
复制
$LDIR/$EXEC &> $LDIR/swapi.log & MYPID=$!

现在它运行得很完美。

感谢大家的帮助!

票数 5
EN

Stack Overflow用户

发布于 2010-08-28 15:08:27

cron运行命令时,环境与登录后从bash命令行运行时的环境不同。在这种情况下,我怀疑sh不能将swapi.php理解为PHP命令。

做一个

代码语言:javascript
复制
which php

查看php二进制文件的位置并将其添加到init.d脚本

代码语言:javascript
复制
PHP=/usr/bin/php 
...
$PHP $LDIR/$EXEC >> $LDIR/swapi.log & MYPID=$!

可能不是那么重要,但是您可能希望重定向cron行的输出

代码语言:javascript
复制
0 * * * * /path/to/script 2>&1 >> /dev/null

例如。

票数 0
EN

Stack Overflow用户

发布于 2010-08-28 15:43:02

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

代码语言:javascript
复制
#!/usr/bin/php
<?php
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3589786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档