【发布时间】:2011-04-05 02:58:36
【问题描述】:
我有一个 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 出现故障,它会调用它。问题是每当我像 cron 作业一样运行时,keepalive 脚本都会挂起(即 run-parts /var/www/html/private/fivemin),(keepalive 脚本位于 /var/www/html/private/fivemin 中) .
我的 init.d 脚本中是否有一些我缺少的时髦的东西?
我已经为这个问题绞尽脑汁好几个小时了!顺便说一句,我在 centos4 上。
感谢您的帮助。 -埃里克
编辑:
keepalive/cronjob 脚本被简化为一个简单的测试:
#!/usr/bin/php
<?
exec("/etc/init.d/swapi start");
?>
奇怪的是,swapi.php 的错误输出像正常的 cron 输出一样被放入 /var/spool/mail,除了我将所有输出都转储到 init.d 脚本中的 swapi.log 中?
当我从 cli 运行 keepalive.php(作为 / 的根目录)时,它的运行方式完全符合我的预期。
当 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 放在变量声明之上,它没有任何区别。
【问题讨论】:
-
请显示使用 cron 作业条目,以及 swapi.php 的头部和它拥有的权限(
ls -l在 swapi.php 目录中)。 -
另外,尝试从控制台手动运行你的初始化脚本几次,你通常会在那里遇到问题。只需确保使用与将其作为 cron 作业(用户、权限、shell 等)调用时完全相同的条件。
-
您应该先尝试
kill -15,然后再尝试kill -9。有关示例,请参见/etc/init.d中的其他脚本。它可能没有任何区别,但是您应该将您的 INIT 节移到变量定义之上。如果您正在使用ps -p,我认为您不需要grep -v grep(grep 'swapi'可能不是必需的,但可以作为健全性检查)。您确实需要显示您的 keepalive 脚本及其 cron 条目。