如何在init脚本中为分叉进程创建PID?

时间:2015-08-19 16:12:36

标签: bash shell uwsgi init pid

我知道问题是什么,但我不确定什么是好的解决方案。

所以,我有一个uwsgi进程,我正在使用Graphite来处理Nginx。以下是一些背景信息:

我从pip安装了uwsgi,并使用-configfile(.ini)运行uwsgi:

[uwsgi]
processes = 1
socket = 127.0.0.1:3031
gid = root
uid = root
chdir = /opt/graphite/conf
daemonize = /var/log/graphite/uwsgi.log
#pidfile = /var/run/uwsgi.pid
module = wsgi:application

我有一个执行以下操作的init脚本(我在互联网上找到了这个并没有这样做):

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="uwsgi daemon"
NAME=uwsgi
DAEMON=/usr/local/bin/uwsgi
CONFIGFILE=/opt/graphite/conf/$NAME.ini
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

set -e
[ -x "$DAEMON" ] || exit 0

start() {
    if [ -f "$PIDFILE" ];then
       echo "${NAME} Service already running" >&2
       return 1
    fi
    echo "Starting $NAME" >&2
    $DAEMON $CONFIGFILE || echo -n "uwsgi already running"     
}

stop() {
    $DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
    rm -f $PIDFILE
    echo "$DAEMON STOPPED."
}

情况如下:如果我有.ini文件创建PID - 它会产生一个甚至不接近实际PID的进程ID。它的工作方式,从我发现的是uwsgi启动,然后选择配置文件并守护进程。所以,如果我要使用

的内容
ps -ef |awk '/[u]wsgi/{print $2}' > $PIDFILE

它将有2个进程ID。 e.g。

cat /opt/uwsgi/uwsgi.ini
4121
4141

现在第二个PID#是实际运行的过程。

如何使用awk命令获取PID,然后将其剪切,以便我只用第二个触摸PIDFILE#?

我不确定使用什么命令。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我没有搜索正确的关键字或其他东西,但我在这里找到了答案: How to use SED to print a specific line

所以,我做的是添加 | sed -n' 2p' 到我的init脚本,我得到了脚本,可以在/var/run/.pid进程中输入正确的PID。

我的初始化脚本如下:

#! /bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="uwsgi daemon"
NAME=uwsgi
DAEMON=/usr/local/bin/uwsgi
CONFIGFILE=/opt/graphite/conf/$NAME.ini
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

set -e
[ -x "$DAEMON" ] || exit 0

start() {
    if [ -f "$PIDFILE" ];then
       echo "${NAME} Service already running" >&2
       return 1
    fi
    echo "Starting $NAME" >&2
    $DAEMON $CONFIGFILE || echo -n "uwsgi already running"
    sleep 2
    ps -ef |awk '/[u]wsgi/{print $2}'| sed -n '2p' > $PIDFILE
}

stop() {
    if [ ! -f "$PIDFILE" ]; then
       echo "${NAME} Service not running" >&2
       return 1
    fi
    $DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
    rm -f $PIDFILE
    echo "$DAEMON STOPPED."
}

status() {
    ps aux |grep $DAEMON |sed -n '1p'
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    stop
    sleep 1
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
esac