我试图使用以下逻辑从linux服务框架启动多个memcached进程:
RETVAL=0
pcount="$CACHES"
if [ ! -z "$pcount" ]; then
while [ $pcount -gt 0 ];
do
(( pcount-- ))
(( port=PORT + pcount ))
daemon --pidfile ${pidfile}${pcount}.pid memcached -d -p $port -u $USER -m $CACHESIZE -c $MAXCONN -P ${pidfile}${pcount}.pid $OPTIONS
(( RETVAL=RETVAL + $? ))
done
else
daemon --pidfile ${pidfile}.pid memcached -d -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P ${pidfile}.pid $OPTIONS
RETVAL=$?
fi
当使用命令 service memcached start
运行时,它会为循环中的每个循环创建和更新pid文件,但只有该进程的最后一个实例仍在运行 . 也就是说,每个 /var/run/memcached/memcached(1 through 5).pid
都是用PID创建和更新的;那些过程不存在 . /var/run/memcached/memcached0.pid
也被创建和更新,PID指向正在运行的进程 .
我打开跟踪,我可以看到执行循环并进行进程调用;但是这个过程没有开始(或者很可能,开始并立即终止,所以我不认为它已经开始) .
另一方面,直接以 /etc/init.d/memcached start
运行此脚本会导致所有进程正确启动 .
有人可以帮助我理解为什么 service
框架阻止除了最后一个实例之外的其他实例的启动?
1 回答
正如@nos所建议的那样,我添加了strace -f来跟踪
service memcached start
操作期间的调用 . 我比较了不成功/终止进程与成功进程之间的跟踪调用 . 我发现的唯一重要区别是:top(<)一个来自已终止的进程,而下一个(>)来自最后一个(成功)进程 . 很明显,由于缺少绑定到端口的权限,该进程正在终止 . 进一步观察,我意识到SELinux被设置为ENFORCE,这阻止了memcached服务绑定到11211(默认端口)以外的端口 .
在我能够想到的最好的情况下,当我在没有
service
命令的情况下运行它时,行为只是一个进程(而不是服务)的行为,因此绑定没有被强制执行 .关闭SELinux的ENFORCED模式,
service memcached start
命令正常工作!