Завис скрипт 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

И затем у меня есть работа 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 над объявлениями переменных, это не имело значения.


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, не будет понята так же оболочкой, и может вызвать зависание процесса. - person Breaking not so bad; 28.08.2010
comment
Можем ли мы увидеть сценарий swapi.php, чтобы лучше понять, что произойдет, когда он будет интерпретирован оболочкой? - 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