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

И тогава имам keepalive cronjob, който извиква това, ако pid падне. Проблемът е, че този скрипт за поддържане на активността виси, когато го стартирам като задача на cron (т.е. run-parts /var/www/html/private/fivemin), (скриптът за поддържане на активността е в /var/www/html/private/fivemin) .

Има ли нещо странно в скрипта ми init.d, което ми липсва?

Разбивам мозъка си върху този проблем от часове! Аз съм на centos4 btw.

Благодаря за всяка помощ. -Ерик

РЕДАКТИРАНЕ:

Скриптът 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

Ето как изглежда 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 над декларациите на променливите, това не направи разлика.


person ehiller    schedule 28.08.2010    source източник
comment
Моля, покажете използването на записа за задача cron, както и заглавката на swapi.php и разрешенията, които има (ls -l в директорията на swapi.php).   -  person polemon    schedule 28.08.2010
comment
Също така, опитайте да стартирате скрипта си за стартиране ръчно от конзолата няколко пъти, обикновено ще се натъкнете на проблема там. Просто се уверете, че използвате точно същите условия, каквито биха били, ако беше извикано като задача на cron (потребител, разрешения, обвивка и т.н.).   -  person polemon    schedule 28.08.2010
comment
Трябва да опитате kill -15, преди да направите kill -9. Вижте други скриптове в /etc/init.d за примери. Може да няма никаква разлика, но трябва да преместите вашата INIT строфа над дефинициите на променливите. Ако правите ps -p, не мисля, че имате нужда от grep -v grep (grep 'swapi' може да не е необходимо, но е добре като проверка на разума). Наистина трябва да покажете вашия скрипт за поддържане на активността и неговия запис в cron.   -  person Dennis Williamson    schedule 28.08.2010


Отговори (3)


Отговорът беше, че bash остава отворен, защото моят скрипт init.d не пренасочва изхода stderr. Сега го промених на

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

И сега функционира перфектно.

Благодаря за помощта на всички!

person ehiller    schedule 20.09.2010

Когато изпълнявате команда от cron, средата не е същата като когато се изпълнява от командния ред bash след влизане. Подозирам в този случай, че sh не може да разбере swapi.php като PHP команда.

Do a

which php

за да видите къде е вашият php двоичен файл и да добавите това към вашия init.d скрипт

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

Вероятно не е толкова важно, но може да искате да пренасочите изхода от реда cron

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

например.

person Breaking not so bad    schedule 28.08.2010
comment
Ако php интерпретаторът не бъде намерен, тогава скриптът просто ще изведе грешка и няма да блокира. - person polemon; 28.08.2010
comment
PHP скриптът ще бъде интерпретиран от обвивката, а не от php интерпретатора. Ако < (първият знак на php скрипт обикновено за <?php) се интерпретира от обвивката и не се управлява от php интерпретатора, има вероятност да увисне. Може да е друга дума в php скрипта - но cron така или иначе е малко вероятно да извика php интерпретатора и е много възможно в такъв скрипт ред, който ще бъде интерпретиран правилно от PHP, да не бъде разбран по същия начин от shell, и може да доведе до спиране на процеса. - person Breaking not so bad; 28.08.2010
comment
Можем ли да видим скрипта swapi.php, за да имаме по-добра представа какво ще се случи, когато се интерпретира от shell? - person Breaking not so bad; 28.08.2010
comment
@ring0: Ето защо поисках първите редове от неговия swapi.php ;) - person polemon; 28.08.2010
comment
Благодаря за предложенията досега, добавих цялата искана информация. Надявам се това да помогне! - person ehiller; 30.08.2010
comment
Опитахте ли с нашите предложения? - person Breaking not so bad; 01.09.2010
comment
@ring0 - Да, опитах да го стартирам от командния ред, тогава работи добре. Той стартира програмата swapi правилно, но след това скриптът за поддържане остава отворен, докато swapi излезе, което, тъй като е демон, е само когато го убия. Добавих целия код по-горе, нещо от това помага ли? - person ehiller; 19.09.2010

Уверете се, че вашият скрипт има правилните разрешения за изпълнение, правилния собственик и първите редове трябва да изглеждат така:

#!/usr/bin/php
<?php
person polemon    schedule 28.08.2010