swoole服务器如何做到无人值守100%可用-Swoole-Swoole文档中心


本站和网页 https://wiki.swoole.com/wiki/page/233.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

swoole服务器如何做到无人值守100%可用-Swoole-Swoole文档中心
Swoole
Swoole内核开发
PHP-X
搜索
搜索
入门指引
Server
Coroutine
Runtime
Timer
Memory
Http\Server
WebSocket\Server
Redis\Server
Process
Process\Pool
Client
Event
Async
高级
Swoole的实现
Reactor线程
Manager进程
Worker进程
Reactor、Worker、TaskWorker的关系
Task/Finish特性的用途
在php-fpm或apache中使用swoole
Swoole异步与同步的选择
TCP/UDP压测工具
swoole服务器如何做到无人值守100%可用
MySQL的连接池、异步、断线重连
PHP中哪些函数是同步阻塞的
守护进程程序常用数据结构
使用jemalloc优化swoole内存分配性能
C开发者如何使用Swoole
C++开发者如何使用Swoole
Swoole协程之旅-前篇
异步回调程序内存管理
Swoole协程之旅-中篇
Swoole协程之旅-后篇
设置 DNS 解析超时和重试
日志等级控制
使用 asan 内存检测
使用systemd管理swoole服务
网卡中断设置
Windows编译
将Swoole静态编译内嵌到PHP
其他
增加子页面
增加同级页面
编辑本页
更多...
Toggle Dropdown
历史修改记录
贡献者名单
警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档
swoole服务器如何做到无人值守100%可用
在某些情况下,如系统负载过大swoole无法申请到内存而挂掉、swoole底层发生段错误、Server占用内存过大被内核Kill,或者被某些程序误杀。那swoole-server将无法提供服务,导致业务中断,公司收入出现损失。
有一个非常有效并且在BAT等大型公司常用的方案是crontab重启监控。
原理是每1分钟执行一次shell脚本,检测server的master进程是否存活,如果存在则跳过。如果发现主进程已经挂掉,则执行restart逻辑,先kill掉所有残留的子进程,然后重新启动Server。
使用下面的脚本需要将Server程序的进程名称设置为master,如 cli_set_process_title("php server.php: master")
如果在系统的crontab中加入:
*/1 * * * * /data/script/check_server.sh
/data/script/check_server.sh:
count=`ps -fe |grep "server.php" | grep -v "grep" | grep "master" | wc -l`
echo $count
if [ $count -lt 1 ]; then
ps -eaf |grep "server.php" | grep -v "grep"| awk '{print $2}'|xargs kill -9
sleep 2
ulimit -c unlimited
/usr/local/bin/php /data/webroot/server.php
echo "restart";
echo $(date +%Y-%m-%d_%H:%M:%S) >/data/log/restart.log
fi
可以改进的地方
可以通过netstat -lnp 检测端口是否在监听,如果未在监听,则执行restart
通过一个check.php发送一段带有逻辑的请求,试探服务器是否可以正常工作,如果无法工作,执行restart
使用supervisor监控进程的工具
如果在Docker容器中使用,可以在docker run时增加参数--restart=always
最新最早最热
7.09万次阅读 28条评论
php_阿斌
真正用这个的话,真要弄个这样子的脚本。
2014-07-09
删除
无尽思绪
没考虑过supervisord?
2014-10-16
删除
蓝颜
使用grep "master"是如何定位到主进程的(ps显示列中没有这个标记啊)?
2014-11-17
删除
程序猿始终不够
grep 这种生产环境偶尔会出现获取到的count不准确的问题。原因可能是crontab使用多进程,进程控制可能存在缺陷的问题。https://github.com/huyanping/Zebra-Daemon 这个包可以精确保证脚本单例运行
2014-12-28
删除
林超
http://mmonit.com/monit/ 这个也不错
2015-02-05
删除
完美才不完美
netstat -lnp 这种方式在重负载下很吃CPU, 雪上加霜.
check.php 在系统繁忙时发请求很有可能被拒掉, 这个时候重启会让服务雪上加霜.
可以在daemon开始的时候, 打开一个文件然后获取一个写锁. 守护脚本也打开文件并设置写锁, 然后阻塞, 一旦写锁获得成功, 则说明daemon已经挂了. 此时守护脚本重启daemon并放弃写锁.
2015-03-27
删除
井田 何渐兴
这里都是大神呀,强,我要向您们学习
2015-05-17
删除
特大号废柴
学习了
2015-06-09
删除
刘朱石强
这里潜台词是启动进程的时候有把master进程,worker进程分别改名。swoole_set_process_name http://wiki.swoole.com/wiki/page/125.html
2015-06-14
删除
咸鱼
master 是主进程的进程名称
2015-11-04
删除
让一切随风
swoole挂掉重启 菜鸟 血与泪的教训 分享给大家
http://www.qiumoon.com/index.php?s=/Home/Article/detail/id/21.html
2015-11-05
删除
张帅
我是把grep "master"去掉了的,貌似加上有问题,去掉执行成功了的[呵呵]
2015-12-23
删除
netstat 可以抛弃了,用ss吧
2015-12-25
删除
fans
为什么用ps -fe |grep "server.php" | grep -v "grep" | grep "master" | awk '{print $2}'|xargs kill -9命令kill掉master进程,子进程不会退出。用kill process_id 杀死master进程,子进程就会退出
2016-02-25
删除
select
怎么设置同步还是异步模式呢
2016-04-21
删除
﹏飄流の風ん
差评!就不能自行判断内存的状态么, 非要借助工具( crontab )检查存活状态。
差评!这是一个不稳定的服务。
2016-05-16
删除
乔嘉
用 lsof -i 端口 + kill 15 定位比较准确 , 如果实时检查程序是否还在运行,可以检查端口是否占用
2016-08-03
删除
CoderKing
systemd完美解决,根本不需要这个啊!
2016-11-09
删除
傻大猫
为啥要挂掉swoole 写稳定的业务程序啊
2016-12-28
删除
为什么我的启动不成功?手动运行脚本可以成功启动。但是用cron定时运行就启动不了。
手动启动后,定时任务执行可以打印Server is already running.证明成功运行了启动的命令,但就是没有启动的时候,cron调用shell启动不成功。哪个知道为什么?
2017-08-17
删除
vary
!/bin/bash
for i in ps -eaf |grep swoole |grep -v sh |grep -v grep | awk '{print $2}'
do
echo "kill swoole pid: [ $i ]"
kill -9 $i
done
ulimit -c unlimited
!/bin/bash
count=ps -fe |grep "swoole" | grep -v "grep" | grep "master" | wc -l
if [ $count -lt 1 ];
then
echo '重启';
/root/home/shell/killswoole.sh
/usr/local/php/bin/php /root/html/swoole.myinit.com/time/Time_Server.php
echo $(date +%Y-%m-%d_%H:%M:%S) >/root/html/swoole.myinit.com/logs/restart.log
echo "restart"
fi
执行失败,是把自己这个脚本(带有swoole名)进程给干掉了
2018-01-16
删除
贝克汉狼
求你们别学了,我跟不上了[大哭]
2018-03-16
删除
梦醒忽闻杏花雨
学习学习。
2018-05-10
删除
微末凡尘
class Monitor
const PORT = 9503;
public function swoole(){
$shell = "netstat -ntul|grep ".self::PORT."| grep LISTEN | wc -l";
$result = shell_exec($shell);
if($result == 0){
//报警,发送短信或者邮箱给负责人
//nohup命令 以守护进程形式重启
$restart_shell = "nohup php /var/www/html/swoole_imooc/thinkphp/server/ws.php > /var/www/html/swoole_imooc/thinkphp/server/t.txt &";
$time = date("Y-m-d H:i:s",time());
$date = date("Ymd",time());
$file = "find /var/log/swoole -name {$date}.log | wc -l";
//记录到日志文件
if($file == 0){
shell_exec("touch /var/log/swoole/{$date}.log");
$log ="echo {$time}.'|restart' >> /var/log/swoole/{$date}.log";
shell_exec($log);
shell_exec($restart_shell);
}else{
echo date("Y-m-d H:i:s",time()).'success';
//执行一次
$monitor = new Monitor();
$monitor->swoole();
2018-07-17
删除
微末凡尘
count=`netstat -nutl | grep 9503 | grep "LISTEN" | wc -l`
#echo $count
if [ $count -lt 1 ];then
nohup php /var/www/html/swoole_imooc/thinkphp/server/ws.php >> /var/log/swoole/swoole.log &
echo "restart".$(date +%Y-%m-%d_%H:%M:%S) >> /var/log/swoole/restart.log
fi
2018-07-18
删除
蛟十五
supervisor好用
2018-08-29
删除
うちは丶dong
直接做个systemctl的service不就得了?
2018-09-29
删除
月光光
系统服务可参照好文: Swoole实验室:使用Systemctl管理Swoole服务
2018-10-19
删除
发布
Swoole.com 2008 - 2022 备案号:苏ICP备19021875号-1 | 苏公网安备 32058302002209号 | 版权声明
官方QQ群:810919826 开发组邮件列表:
team@swoole.com
当前Swoole扩展版本:swoole-SWOOLE_VERSION