Bắt shell script để chạy như một daemon trên CentOS?


8

EDIT: Vì một số lý do, một nửa bài đăng của tôi bị cắt ngắn, không chắc chuyện gì đã xảy ra. Tôi sẽ cập nhật sớm và sẽ đăng rằng nó được cập nhật ở trên cùng.

EDIT: Tôi đã cập nhật bài viết một lần nữa, xin lỗi vì câu hỏi chưa hoàn chỉnh.

EDIT (8:55 PM EST 10/10/2011): Tôi đã cập nhật /srv/rhodecode/start.sh như Steven đề xuất, vẫn không có niềm vui. Nó tiếp tục treo như vậy:

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

Tôi đã cập nhật các tập lệnh bên dưới để hiển thị các thay đổi.


Tôi chưa bao giờ viết shell hay script bash trong đời. Tôi đang cố gắng cài đặt RhodeCode trên CentOS và có các tập lệnh init cho Debian và Gentoo, nhưng không phải cho RedHat / CentOS, điều đó thật điên rồ với tôi. Vì vậy, tôi cần phải viết một vì môi trường máy chủ của chúng tôi bị hạn chế chạy CentOS 5. Nguồn cho dự án có thể được tìm thấy tại Bitbucket tại đây .

Ý tưởng là chạy RhodeCode w / Celery và RabbitMQ. Tất cả được viết bằng Python và tôi có môi trường trong bộ chứa ảo riêng biệt bằng virtualenv. Tôi có ý tưởng cho kịch bản shell ở đây .

Tôi đã tạo một người dùng hệ thống có tên rhodecode và tạo thư mục / var / run / rhodecode và nó thuộc sở hữu của rhodecode. Tôi cũng đã tạo / var / www / rhodecode nơi sản xuất.ini, cũng như /srv/rhodecode/start.sh, tất cả đều thuộc sở hữu của rhodecode.

Quyền:

[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

Tôi có các tập lệnh bash và shell sau đây.

/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

Khi tôi chạy sudo /etc/init.d/rhodecode-server startvà sau đó chạy ps -aux | grep paster, tôi có thể thấy paster serve production.inilệnh từ /srv/rhodecode/start.sh đã đi qua và đang chạy với id người dùng của 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

Tuy nhiên, không có tệp pid nào được tạo, vì vậy tôi không thể dừng máy chủ khỏi tập lệnh init của mình. Tôi không chắc tại sao daemon không tạo ra pidfile. Đường dẫn đến tệp pid là hợp lệ và quyền là chính xác. Suy nghĩ?


@mailq Tôi cập nhật câu hỏi của tôi. Vì một số lý do, một nửa bài đăng đã bị cắt ngắn ... Câu hỏi liên quan đến lý do tại sao daemon không tạo tệp pid.
Lester Peabody

Là quyền trên /var/run/rhodecode/pidchính xác cho người dùng này đang chạy như? Đối với vấn đề đó, biến đó có đúng hay không /var/run/rhodecode.pid?
John Gardeniers

@ John Tôi đã thêm một phần quyền vào bài đăng của mình để liệt kê các quyền trên tất cả các thư mục và tệp liên quan đến quá trình này (theo hiểu biết của tôi).
Lester Peabody

Vui lòng gửi kèm thông tin gỡ lỗi của bạn sh -x /etc/init.d/rhodecode-server start?
lượng tử

daemon --pidfilechỉ xác định nơi tập tin pid là. các chức năng trong CentOS dường như không có --make-pidfiletùy chọn bắt buộc
KCD

Câu trả lời:


1

Tôi nghĩ rằng vấn đề của bạn là trong /srv/rhodecode/start.sh. Nó hiện đang bắt đầu pasternhư một quá trình nền riêng biệt và sau đó thoát ngay lập tức. Điều này đặt ra một vấn đề cho tập lệnh init của bạn, nó dự kiến ​​sẽ start.shlà quá trình trình nền dài chạy được quản lý.

Vì vậy, hãy thử thay đổi dòng cuối cùng /srv/rhodecode/start.shđể đọc như sau:

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

Sử dụng execmake start.sh trở thành paster , sau đó được trình bày bằng daemonlệnh trong tập lệnh init.


Trong tâm trí tôi biết đây chính xác là vấn đề, tôi không biết phải tìm kiếm gì. Tôi đã thử paster cả có và không có & và rõ ràng cả hai lần tôi đều không có kết quả. Thật không may, tôi vừa từ văn phòng về nhà, tôi sẽ thực hiện điều này đầu tiên vào sáng mai.
Lester Peabody

Tôi thực sự chỉ cần SSH vào và dùng thử và nó cũng không hoạt động .. nó vẫn tiếp tục bị treo, tôi sẽ cập nhật bài viết của mình.
Lester Peabody

0

Bạn có phải chỉ định vị trí? Bạn có thể sử dụng tùy chọn --name để đặt tên cho nó không? Điều đó sẽ tạo ra PID cho bạn và dọn sạch nó khi bạn hoàn thành. Vì vậy, nó sẽ trông như:

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

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

Không có tùy chọn nào như '--stop' hoặc --name trong Centos 6.5
MariuszS

Không có --namehoặc --stoptrong Centos 5.
Jim Mitchener
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.