2011-04-25 4 views
0

간단한 파이썬 스크립트 test.py :init.d 스크립트가 실행 파일의 stdin stderr을 리디렉션하지 못하고 잘못된 프로세스 ID를 얻습니다.

그런 다음 ./test.py &> logfile.log & PID=$!을 수행하려고 시도하는 init.d 스크립트가 있습니다. 그 이유는 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." 
     ;; 

출력 :

#! /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 

내가 과거 2 시간 동안 이것에 벽에 내 머리를 두드리는 있었어요 :

-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 스크립트가 있습니다. 누구든지 아이디어가있어?

답변

1

init 스크립트에 sudo을 사용하지 마십시오. #!/bin/sh을 사용하는 모든 스크립트에서 &>을 사용하면 안됩니다. init 스크립트에서 $!을 사용해서는 안되며, 사용법이 잘못되었다고 생각합니다.

모든 것을 훨씬 단순하게 만들기 위해, 특히 PID 항목을 사용하는 것이 좋습니다. 그러나 출력을 로그 파일로 리디렉션하는 것과 함께 사용할 수 있는지 확실하지 않습니다.

+0

나는 다른 SO 질문에서 대부분을 복사했는데, 인생을 훨씬 쉽게 만들어주는'start-stop-daemon'을 알려 주셔서 감사합니다. :) –