的init.d脚本挂
我有一个脚本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放在变量声明之上,但没有什么区别。
答案是bash的是保持开放,因为我的init.d脚本没有重定向stderr输出。我现在已将其更改为
$LDIR/$EXEC &> $LDIR/swapi.log & MYPID=$!
现在它功能完好。
感谢大家的帮助!
当您从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
例如重定向。
如果php解释器不能被找到,那么脚本就会抛出一个错误,而不会卡住。 – polemon 2010-08-28 07:16:19
PHP脚本将由shell解释,而不是由php解释器解释。如果' 2010-08-28 07:31:04
我们能否看到swapi.php脚本更好地了解shell被解释时会发生什么? – 2010-08-28 07:38:53
确保您的脚本有正确执行权限,权利人,和第一线应该是这样的:
#!/usr/bin/php
<?php
请显示使用cron作业条目,以及swapi.php的头文件和它拥有的权限(swapi.php目录中的'ls -l')。 – polemon 2010-08-28 07:03:54
另外,尝试从控制台手动运行您的init脚本几次,您通常会在那里遇到问题。只要确保您使用的条件与被称为cron作业(用户,权限,shell等)的条件完全相同。 – polemon 2010-08-28 07:08:00
在执行kill -9之前,您应该尝试'kill -15'。有关示例,请参阅'/ etc/init.d'中的其他脚本。它可能没有任何区别,但是你应该将INIT节移动到变量定义之上。如果你正在做'ps -p',我认为你不需要'grep -v grep'(grep'swapi''可能不是必需的,但它可以作为完整性检查)。你真的需要展示你的Keepalive脚本和它的cron条目。 – 2010-08-28 15:00:48