使Shell脚本在CentOS上作为守护程序运行?


8

编辑:由于某种原因,我的帖子一半被截断,不确定发生了什么。我将尽快更新,并将在顶部发布。

编辑:我再次更新了帖子,对不完整的问题表示抱歉。

编辑(美国东部标准时间2011年10月10日晚上8:55):我像史蒂文建议的那样更新了/srv/rhodecode/start.sh,仍然没有喜悦。它继续像这样挂起:

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

我已经更新了以下脚本以显示更改。


我一生中从未写过shell或bash脚本。我正在尝试在CentOS上安装RhodeCode,并且有Debian和Gentoo的初始化脚本,但没有RedHat / CentOS的初始化脚本,这对我来说太疯狂了。所以我需要写一个,因为我们的服务器环境仅限于运行CentOS5。该项目的源代码可以在Bitbucket上找到

这个想法是运行带有Celery和RabbitMQ的RhodeCode。这些都是用Python编写的,我使用virtualenv将环境包含在自己的独立虚拟容器中。我在这里有了shell脚本的主意。

我创建了一个名为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文件,因此无法从初始化脚本中停止服务器。我不确定为什么守护程序没有创建pidfile。pid文件的路径有效且权限正确。有什么想法吗?


@mailq我更新了我的问题。由于某种原因,一半帖子被截断了。问题是关于守护程序为什么不创建pid文件。
Lester Peabody

/var/run/rhodecode/pid对此用户的运行权限是否正确?就此而言,那个变量是正确的还是应该/var/run/rhodecode.pid
John Gardeniers

@John我已在我的帖子中添加了一个权限部分,以列出此过程中涉及的所有目录和文件的权限(据我所知)。
Lester Peabody

请附上您的调试信息sh -x /etc/init.d/rhodecode-server start
量子

daemon --pidfile仅指定pid文件的位置。CentOS中的函数似乎没有必需的--make-pidfile选项
KCD 2015年

Answers:


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,然后由该进程化daemon在init脚本命令。


在我的脑海中,我知道这正是问题所在,我根本不知道要寻找什么。我尝试了带和不带&的粘贴器,显然两次都没有结果。不幸的是我刚从办公室回到家,明天早上我将执行第一件事。
Lester Peabody

我实际上只是通过SSHd尝试了一下,但它也无法正常工作..它继续挂起,我将更新我的帖子。
Lester Peabody

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 2014年

没有--name--stop在CentOS 5的两种。
Jim Mitchener 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.