我知道问题是什么,但我不确定什么是好的解决方案。
所以,我有一个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#?
我不确定使用什么命令。有什么想法吗?
答案 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