Заставить скрипт оболочки работать в CentOS как демон?

8

РЕДАКТИРОВАТЬ: По какой-то причине половина моего поста была обрезана, не уверен, что случилось. Я скоро обновлю и опубликую, что это обновлено здесь наверху.

РЕДАКТИРОВАТЬ: я обновил пост снова, извините за неполный вопрос.

РЕДАКТИРОВАТЬ (8:55 вечера EST 10/10/2011): я обновил /srv/rhodecode/start.sh, как предложил Стивен, до сих пор не радует. Он продолжает висеть так:

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

Я обновил сценарии ниже, чтобы показать изменения.


В своей жизни я никогда не писал сценарии оболочки или bash. Я пытаюсь установить RhodeCode на CentOS, и есть сценарии инициализации для Debian и Gentoo, но не для RedHat / CentOS, что для меня безумно. Поэтому мне нужно написать один, потому что наша серверная среда ограничена работой CentOS 5. Исходный код проекта можно найти здесь, в Bitbucket .

Идея состоит в том, чтобы запустить RhodeCode с Celery и RabbitMQ. Все написано на Python, и у меня есть среда в отдельном виртуальном контейнере с использованием virtualenv. У меня есть идея для сценария оболочки здесь .

Я создал системного пользователя с именем rhodecode и создал каталог / var / run / rhodecode, и он принадлежит rhodecode. Я также создал / var / www / rhodecode, где находится production.ini, и /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 (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-файл не создается, поэтому я не могу остановить сервер от моего скрипта инициализации. Я не уверен, почему демон не создает pid-файл. Путь к файлу pid действителен, а права доступа верны. Мысли?

Лестер Пибоди
источник
@mailq Я обновил свой вопрос. По какой-то причине половина сообщения была усечена ... Вопрос в том, почему демон не создает pid-файл.
Лестер Пибоди
/var/run/rhodecode/pidПравильно ли разрешение для пользователя, под которым он работает? В этом отношении, эта переменная верна или должна быть /var/run/rhodecode.pid?
Джон Гарденье
@ Джон Я добавил раздел разрешений в свой пост, чтобы перечислить разрешения для всех каталогов и файлов, участвующих в этом процессе (насколько мне известно).
Лестер Пибоди
Пожалуйста, приложите вашу отладочную информацию sh -x /etc/init.d/rhodecode-server start?
Quanta
daemon --pidfileтолько указывает, где находится файл pid. функции в CentOS, кажется, не имеют требуемой --make-pidfileопции
KCD

Ответы:

1

Я думаю, что ваша проблема в /srv/rhodecode/start.sh. В настоящее время он начинается pasterкак отдельный фоновый процесс, а затем сразу же завершается. Это создает проблему для вашего сценария инициализации, который, как ожидается start.sh, будет длительным процессом демона, которым нужно управлять.

Таким образом, попробуйте изменить последнюю строку /srv/rhodecode/start.shследующим образом:

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

Использование execмарки start.sh стали paster , которая затем daemonized по daemonкоманде в сценарии инициализации.

Стивен Понедельник
источник
По-моему, я знал, что это именно та проблема, я просто понятия не имел, что искать. Я пробовал пастер как с, так и без & и, очевидно, оба раза у меня не было результатов. К сожалению, я только что пришла домой из офиса, я выполню это первым делом завтра утром.
Лестер Пибоди
Я на самом деле просто SSHd и попробовал его, и он тоже не работал .. он продолжает зависать, я обновлю свой пост.
Лестер Пибоди
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 либо.
Джим Митченер