CentOS에서 데몬으로 셸 스크립트를 실행할 수 있습니까?


8

편집 : 어떤 이유로 내 게시물의 절반이 잘 렸습니다. 무슨 일이 일어 났는지 확실하지 않습니다. 나는 곧 업데이트하고 여기에 맨 위에 업데이트된다고 게시 할 것입니다.

편집 : 게시물을 다시 업데이트했습니다. 불완전한 질문에 대해 죄송합니다.

편집 (8:55 PM EST 10/10/2011) : Steven이 제안한 것처럼 /srv/rhodecode/start.sh를 업데이트했지만 여전히 기쁨은 없습니다. 다음과 같이 계속 매달려 있습니다.

[lpeabody@vcs rhodecode]$ sudo /etc/init.d/rhodecode-server start
Starting rhodecode-server:

변경 사항을 표시하기 위해 아래 스크립트를 업데이트했습니다.


내 인생에서 쉘이나 bash 스크립트를 쓴 적이 없다. CentOS에 RhodeCode를 설치하려고하는데 데비안과 젠투에 대한 초기화 스크립트가 있지만 RedHat / CentOS에는 적합하지 않습니다. 서버 환경이 CentOS 5를 실행하도록 제한되어 있기 때문에 하나를 작성해야합니다. 프로젝트의 소스는 Bitbucket here 에서 찾을 수 있습니다 .

아이디어는 Celery 및 RabbitMQ와 RhodeCode를 실행하는 것입니다. 그것은 모두 파이썬으로 작성되었으며 virtualenv를 사용하는 별도의 가상 컨테이너에 환경이 있습니다. 나는 쉘 스크립트에 대한 아이디어를 가지고 여기를 .

rhodecode라는 시스템 사용자를 만들고 / var / run / rhodecode 디렉토리를 만들었으며 rhodecode가 소유하고 있습니다. 또한 production.ini가있는 / var / www / rhodecode와 /srv/rhodecode/start.sh를 만들었습니다. 모두 rhodecode가 소유하고 있습니다.

권한 :

[lpeabody@vcs run]$ ll -a /var/run/rhodecode
total 12
drwxr-xr-x  2 rhodecode rhodecode 4096 Oct 10 15:57 .
drwxr-xr-x 21 root      root      4096 Oct 10 16:07 ..

[lpeabody@vcs run]$ ll -a /var/www/rhodecode
total 76
drwxr-xr-x  4 rhodecode rhodecode  4096 Oct 10 16:47 .
drwxr-xr-x 11 root      root       4096 Oct  5 14:54 ..
drwxrwxr-x  3 rhodecode rhodecode  4096 Oct  5 19:40 data
-rw-r--r--  1 rhodecode rhodecode     0 Oct 10 16:41 debug.log
-rw-r--r--  1 rhodecode rhodecode  1466 Oct 10 16:41 error.log
-rw-rw-r--  1 rhodecode rhodecode  6000 Oct  6 15:27 production.ini
drwxrwxr-x  2 rhodecode rhodecode  4096 Oct  5 18:37 repos
-rw-r--r--  1 rhodecode rhodecode 44032 Oct  5 19:16 rhodecode.db

[lpeabody@vcs run]$ ll -a /srv/rhodecode/
total 16
drwxr-xr-x 2 rhodecode rhodecode 4096 Oct 10 16:40 .
drwxr-xr-x 4 root      root      4096 Oct  7 14:40 ..
-rwxr-xr-x 1 rhodecode rhodecode  277 Oct 10 16:40 start.sh

다음 bash 및 shell 스크립트가 있습니다.

/srv/rhodecode/start.sh

#!/bin/bash                                                                                               
# run this as the rhodecode user!                                                                         

WDIR=/var/www/rhodecode                                                                                   
VIRTUALENV_DIR=/opt/python_virtualenvironments/rhodecode-venv                                             
export PYTHON_EGG_CACHE=/tmp/.python-eggs                                                                 

source $VIRTUALENV_DIR/bin/activate                                                                       

cd $WDIR                                                                                                  
exec paster serve production.ini 1> debug.log 2> error.log

/etc/init.d/rhodecode-server

#!/bin/sh                                                                                                                                                                                                                                    
#                                                                                                                                                                                                                                            
# rhodecode-server RhodeCode server instance                                                                                                                                                                                                 
#                                                                                                                                                                                                                                            
#                                                                                                                                                                                                                                            

# PATH=/sbin:/usr/sbin:/bin:/usr/bin                                                                                                                                                                                                         
NAME=rhodecode-server                                                                                                                                                                                                                        
DESC=rhodecode-server                                                                                                                                                                                                                        
USER=rhodecode                                                                                                                                                                                                                               
PID_FILE=/var/run/rhodecode/pid                                                                                                                                                                                                              
CMD=/srv/rhodecode/start.sh                                                                                                                                                                                                                  

LOCK_FILE=/var/lock/subsys/$NAME                                                                                                                                                                                                             

. /etc/init.d/functions                                                                                                                                                                                                                      

RETVAL=0                                                                                                                                                                                                                                     

remove_pid () {                                                                                                                                                                                                                              
    rm -f ${PID_FILE}                                                                                                                                                                                                                        
}                                                                                                                                                                                                                                            

start_rhodecode () {                                                                                                                                                                                                                         
    daemon --user $USER --pidfile $PID_FILE $CMD                                                                                                                                                                                        
    RETVAL=$?                                                                                                                                                                                                                                
    [ $RETVAL -eq 0 ] && touch $LOCK_FILE                                                                                                                                                                                                    
    return $RETVAL                                                                                                                                                                                                                           
}                                                                                                                                                                                                                                            

stop_rhodecode () {                                                                                                                                                                                                                          
    killproc -p $PID_FILE                                                                                                                                                                                                                    
    RETVAL=&?                                                                                                                                                                                                                                
    rm -f $LOCK_FILE                                                                                                                                                                                                                         
    rm -f $PID_FILE                                                                                                                                                                                                                          
    return $RETVAL                                                                                                                                                                                                                           
}                                                                                                                                                                                                                                            

restart_rhodecode () {                                                                                                                                                                                                                       
    stop_rhodecode                                                                                                                                                                                                                           
    start_rhodecode                                                                                                                                                                                                                          
    RETVAL=$?                                                                                                                                                                                                                                
}                                                                                                                                                                                                                                            

case "$1" in                                                                                                                                                                                                                                 
  start)                                                                                                                                                                                                                                     
    echo -n $"Starting $DESC: "                                                                                                                                                                                                              
    start_rhodecode                                                                                                                                                                                                                          
    echo                                                                                                                                                                                                                                     
    ;;                                                                                                                                                                                                                                       
  stop)                                                                                                                                                                                                                                      
    echo -n $"Stopping $DESC: "                                                                                                                                                                                                              
    stop_rhodecode                                                                                                                                                                                                                           
    echo                                                                                                                                                                                                                                     
    ;;                                                                                                                                                                                                                                       
  restart)                                                                                                                                                                                                                                   
    echo -n $"Restarting $DESC: "                                                                                                                                                                                                            
    restart_rhodecode                                                                                                                                                                                                                        
    echo                                                                                                                                                                                                                                     
    ;;
  *)                                                                                                                                                                                                                                         
    echo $"Usage: $0 {start|stop|restart}"                                                                                                                                                                                                   
    RETVAL=1                                                                                                                                                                                                                                 
    ;;                                                                                                                                                                                                                                       
esac                                                                                                                                                                                                                                         

exit $RETVAL

내가 실행 sudo /etc/init.d/rhodecode-server start한 다음 실행 ps -aux | grep paster하면 paster serve production.ini/srv/rhodecode/start.sh 의 명령이 통과하여 rhodecode의 사용자 ID (102)로 실행되고 있음을 알 수 있습니다.

102       5222  0.7  7.8 144300 80988 ?        Sl   16:08   0:00 /opt/python_virtualenvironments/rhodecode-venv/bin/python /opt/python_virtualenvironments/rhodecode-venv/bin/paster serve production.ini

그러나 pid 파일이 생성되지 않으므로 init 스크립트에서 서버를 중지 할 수 없습니다. 왜 데몬이 pidfile을 생성하지 않는지 잘 모르겠습니다. pid 파일의 경로가 유효하고 권한이 올바른지 생각?


@mailq 질문을 업데이트했습니다. 어떤 이유로 포스트의 절반이 잘 렸습니다 ... 데몬이 pid 파일을 생성하지 않는 이유에 대한 질문입니다.
레스터 피바디

/var/run/rhodecode/pid현재 실행중인 사용자에게 올바른 권한 이 있습니까? 그 문제에 대해서는 그 변수가 정확 /var/run/rhodecode.pid합니까?
John Gardeniers

@John이 프로세스와 관련된 모든 디렉토리 및 파일에 대한 권한을 (나의 지식으로) 나열하기 위해 게시물에 권한 섹션을 추가했습니다.
레스터 피바디

디버그 정보를 동봉하십시오 sh -x /etc/init.d/rhodecode-server start?
quanta

daemon --pidfilepid 파일이있는 위치 만 지정합니다. CentOS의 기능에 필요한 --make-pidfile옵션 이없는 것 같습니다
KCD

답변:


1

귀하의 문제는에 있다고 생각합니다 /srv/rhodecode/start.sh. 현재 paster별도의 백그라운드 프로세스로 시작한 후 즉시 종료됩니다. 이것은 init 스크립트에 문제가되는데,이 스크립트는 start.sh자체적으로 오래 실행되는 데몬 프로세스가 관리 될 것으로 예상 합니다.

따라서 /srv/rhodecode/start.sh다음과 같이 읽을 마지막 줄을 변경하십시오 .

exec paster serve production.ini 1> debug.log 2> error.log

사용 exec차종이 start.sh paster 다음으로 daemonized되는, daemon초기화 스크립트 명령.


내 마음에 나는 이것이 정확히 문제라는 것을 알았고, 무엇을 찾아야할지 전혀 모른다. 나는 &를 사용하거나 사용하지 않고 Paster를 시도했지만 분명히 두 가지 결과가 없었습니다. 불행히도 나는 방금 사무실에서 집으로 돌아 왔고, 내일 아침에이 첫 번째를 구현할 것입니다.
레스터 피바디

실제로 SSH를 입력하여 시도했지만 작동하지 않았습니다. 계속 중단됩니다. 게시물을 업데이트하겠습니다.
레스터 피바디

0

위치를 지정해야합니까? --name 옵션을 사용하여 이름을 지정할 수 있습니까? 그러면 PID가 생성되고 완료되면 정리됩니다. 따라서 다음과 같습니다.

$NAME="rhodecode"
start_rhodecode () {                                                                                                                                                                                                                         
    daemon --user $USER --name $NAME $CMD                                                                                                                                                                                        
    RETVAL=$?                                                                                                                                                                                                                                
    return $RETVAL                                                                                                                                                                                                                           
} 

stop_rhodecode () {                                                                                                                                                                                                                          
    daemon --name $NAME --stop                                                                                                                                                           
    RETVAL=&?                                                                                                                                                                                                                                                                                                         
    return $RETVAL                                                                                                                                                                                                                           
}     

Centos 6.5에는 '--stop'또는 --name과 같은 옵션이 없습니다.
MariuszS

더 없습니다 --name또는 --stop를 CentOS 5 중 하나.
Jim Mitchener
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.