Скрипт init.d не может перенаправить stdin stderr исполняемого файла и получает неправильный идентификатор процесса

У меня есть простой скрипт Python test.py:

#!/user/bin/python
print "Why is it not redirecting?"

Затем у меня есть сценарий init.d, в котором я пытаюсь сделать ./test.py &> logfile.log & PID=$!, за исключением того, что происходит неправильное PID, он печатает в мою оболочку вместо перенаправления. Я тестирую скрипт, помещая его в /etc/init.d и запуская sudo service productcrawler-router start (я использую sudo, потому что мой настоящий скрипт открывает порты на сервере). Соответствующий раздел скрипта init.d.

case "$1" in
  start)
        if [ -f $PIDF ]
        then
            echo "$NAME is currently running. Killing running process..."
            $IEXE stop
        fi
        cd $LDIR
        if [ -f $LDIR/$NAME.log ] ; then
            echo "File already exist."
        fi
        sudo python ./$EXEC &> $LDIR/$NAME.log & MYPID=$!
        ls -l $LDIR | grep $NAME
        echo $MYPID
        ps aux | grep "router"
        ps aux | grep $MYPID
        echo "$NAME are now running."
        ;;

Выходы:

-rw-r--r-- 1 root root      0 2011-04-25 13:57 productcrawler-router.log
11944
Why is it not redirecting?
root     11053  0.0  0.2  20364  5704 pts/2    Sl   13:45   0:00 python ./router.py
root     11933  2.0  0.0   1896   552 pts/2    S+   13:57   0:00 /bin/sh /etc/init.d/productcrawler-router start
root     11948  0.0  0.0   4008   752 pts/2    S+   13:57   0:00 grep router
root     11950  0.0  0.0   4008   756 pts/2    S+   13:57   0:00 grep 11944
productcrawler-router are now running.

Затем у меня есть скрипт init.d:

#! /bin/sh
# chkconfig 345 85 60
# description: startup script for produtcrawler-router
# processname: producrawler-router

NAME=productcrawler-router
LDIR=/etc/productcrawler/services
EXEC=test.py
PIDF=/var/run/productcrawler.pid
IEXE=/etc/init.d/productcrawler-router

### BEGIN INIT INFO
# Provides:          productcrawler-router
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     5
# Default-Stop:      0 1 2 3 6
# Description:       Starts the productcrawler-router service
### END INIT INFO

if [ ! -f $LDIR/$EXEC ]
then
        echo "$LDIR/$EXEC not found."
        exit
fi

case "$1" in
  start)
        if [ -f $PIDF ]
        then
            echo "$NAME is currently running. Killing running process..."
            $IEXE stop
        fi
        cd $LDIR
        if [ -f $LDIR/$NAME.log ] ; then
            echo "File already exist."
        fi
        sudo python ./$EXEC &> $LDIR/$NAME.log & MYPID=$!
        ls -l $LDIR | grep $NAME
        echo $MYPID
        ps aux | grep "router"
        ps aux | grep $MYPID
        echo "$NAME are now running."
        ;;
  stop)
        if [ -f $PIDF ]
        then
                echo "Stopping $NAME."
                PID_2=`cat $PIDF`
                if [ ! -z "`ps -f -p $PID_2 | grep -v grep | grep '$NAME'`" ]
                then
                        kill -9 $PID_2
                fi
                rm -f $PIDF
        else
                echo "$NAME is not running, cannot stop it."
        fi
        ;;
  force-reload|restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Use: /etc/init.d/$NAME {start|stop|restart|force-reload}"
        exit 1
esac

Я бьюсь головой об стену об этом последние два часа. У кого-нибудь есть идеи?


person Kit Sunde    schedule 25.04.2011    source источник


Ответы (1)


Вы не должны использовать sudo в сценарии инициализации. Вы не должны использовать &> в любом скрипте, использующем #!/bin/sh. Вы, вероятно, не должны использовать $! в сценарии инициализации, и я думаю, что вы используете его действительно неправильно.

Я рекомендую использовать start-stop-daemon, чтобы сделать все намного проще, особенно материал PID, но я не уверен, что вы можете использовать его вместе с перенаправлением вывода в файл журнала.

person Arrowmaster    schedule 25.04.2011
comment
Я скопировал большую часть из другого вопроса SO, спасибо, что указали мне на start-stop-daemon, который действительно делает жизнь намного проще. :) - person Kit Sunde; 30.04.2011