У меня есть скрипт 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
И затем у меня есть работа cron для поддержания активности, которая вызывает это, если pid выходит из строя. Проблема в том, что этот скрипт поддержки активности зависает всякий раз, когда я запускаю его как задание cron (например, run-parts /var/www/html/private/fivemin) (скрипт поддержки активности находится в /var/www/html/private/fivemin) .
Есть ли что-то необычное в моем сценарии init.d, которого мне не хватает?
Я ломаю голову над этой проблемой уже несколько часов! Я на Centos4 кстати.
Спасибо за любую помощь. -Эрик
РЕДАКТИРОВАТЬ:
Скрипт keepalive/cronjob был упрощен для тестирования до простого:
#!/usr/bin/php
<?
exec("/etc/init.d/swapi start");
?>
Странно, что вывод ошибки из swapi.php помещается в /var/spool/mail, как обычный вывод cron, за исключением того, что у меня весь вывод сбрасывается в swapi.log в сценарии init.d?
Когда я запускаю keepalive.php из cli (как 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
Вот как выглядит кронтаб:
*/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 над объявлениями переменных, это не имело значения.
ls -l
в каталоге swapi.php). - person polemon   schedule 28.08.2010kill -15
, прежде чем делатьkill -9
. Примеры см. в других сценариях в/etc/init.d
. Это может не иметь никакого значения, но вы должны переместить строфу INIT над определениями переменных. Если вы выполняетеps -p
, я не думаю, что вам нуженgrep -v grep
(grep 'swapi'
может и не понадобиться, но это нормально для проверки работоспособности). Вам действительно нужно показать свой скрипт поддержки активности и его запись в cron. - person Dennis Williamson   schedule 28.08.2010