Membuat skrip shell dijalankan sebagai daemon di CentOS?

8

EDIT: Untuk beberapa alasan setengah dari posting saya terpotong, tidak yakin apa yang terjadi. Saya akan segera memperbarui dan akan memposting bahwa itu diperbarui di sini di bagian atas.

EDIT: Saya telah memperbarui posting lagi, maaf untuk pertanyaan yang tidak lengkap.

EDIT (20:55 EST 10/10/2011): Saya memperbarui /srv/rhodecode/start.sh seperti yang disarankan Steven, masih belum ada sukacita. Itu terus menggantung seperti:

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

Saya telah memperbarui skrip di bawah ini untuk menunjukkan perubahan.


Saya tidak pernah menulis shell atau skrip bash dalam hidup saya. Saya mencoba menginstal RhodeCode pada CentOS, dan ada skrip init untuk Debian dan Gentoo, tetapi tidak untuk RedHat / CentOS yang gila bagi saya. Jadi saya perlu menulis satu karena lingkungan server kami dibatasi untuk menjalankan CentOS 5. Sumber untuk proyek ini dapat ditemukan di Bitbucket di sini .

Idenya adalah untuk menjalankan RhodeCode dengan Celery dan RabbitMQ. Semuanya ditulis dalam Python dan saya memiliki lingkungan di dalamnya wadah virtual terpisah menggunakan virtualenv. Saya mendapat ide untuk skrip shell di sini .

Saya telah membuat pengguna sistem bernama rhodecode dan membuat direktori / var / run / rhodecode dan itu dimiliki oleh rhodecode. Saya juga membuat / var / www / rhodecode di mana production.ini berada, serta /srv/rhodecode/start.sh, yang semuanya dimiliki oleh rhodecode.

Izin:

[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

Saya memiliki skrip bash dan shell berikut.

/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

Ketika saya menjalankan sudo /etc/init.d/rhodecode-server startdan kemudian menjalankan ps -aux | grep paster, saya dapat melihat paster serve production.iniperintah dari /srv/rhodecode/start.sh melewati dan berjalan dengan id pengguna 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

Namun, tidak ada file pid yang dibuat, jadi saya tidak bisa menghentikan server dari skrip init saya. Saya tidak yakin mengapa daemon tidak membuat pidfile. Jalur ke file pid valid dan izin sudah benar. Pikiran?

Lester Peabody
sumber
@mailq Saya memperbarui pertanyaan saya. Untuk beberapa alasan setengah pos telah terpotong ... Pertanyaannya adalah mengenai mengapa daemon tidak membuat file pid.
Lester Peabody
Apakah izin pada yang /var/run/rhodecode/pidbenar untuk pengguna ini berjalan? Dalam hal ini, apakah variabel itu benar atau seharusnya /var/run/rhodecode.pid?
John Gardeniers
@ John Saya telah menambahkan bagian izin ke posting saya untuk mendaftar izin pada semua direktori dan file yang terlibat dalam proses ini (setahu saya).
Lester Peabody
Harap lampirkan info debug Anda sh -x /etc/init.d/rhodecode-server start?
quanta
daemon --pidfilehanya menentukan di mana file pid. fungsi dalam CentOS tampaknya tidak memiliki --make-pidfileopsi yang diperlukan
KCD

Jawaban:

1

Saya pikir masalah Anda ada di /srv/rhodecode/start.sh. Saat ini mulai pastersebagai proses latar belakang yang terpisah dan kemudian segera keluar. Ini menimbulkan masalah bagi skrip init Anda, yang mengharapkan start.shdirinya sendiri menjadi proses daemon yang berjalan lama untuk dikelola.

Jadi, coba ubah baris terakhir /srv/rhodecode/start.shmenjadi sebagai berikut:

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

Menggunakan execmake start.sh menjadi paster , yang kemudian di daemonisasi oleh daemonperintah dalam skrip init.

Steven Monday
sumber
Dalam pikiran saya, saya tahu ini adalah masalahnya, saya tidak tahu apa yang harus dicari. Saya mencoba paster baik dengan dan tanpa & & dan jelas kedua kali saya tidak mendapatkan hasil. Sayangnya saya baru pulang dari kantor, saya akan menerapkan hal pertama ini besok pagi.
Lester Peabody
Saya sebenarnya hanya SSHd di dan mencobanya dan tidak berhasil juga .. terus hang, saya akan memperbarui posting saya.
Lester Peabody
0

Apakah Anda harus menentukan lokasi? Bisakah Anda menggunakan opsi --name untuk memberinya nama? Itu akan membuat PID untuk Anda dan membersihkannya setelah Anda selesai. Jadi akan terlihat seperti:

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

stop_rhodecode () {                                                                                                                                                                                                                          
    daemon --name $NAME --stop                                                                                                                                                           
    RETVAL=&?                                                                                                                                                                                                                                                                                                         
    return $RETVAL                                                                                                                                                                                                                           
}     
Jeffery Smith
sumber
Tidak ada pilihan seperti '--stop' atau --name di Centos 6.5
MariuszS
Tidak ada --nameatau --stopdalam Centos 5 baik.
Jim Mitchener