首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
关于 swoole 使用 systemctl 重启问题
# swoole 重启 版本:swoole 4.5.10 配置文件 service ```ini [Service] Type=simple LimitNOFILE=65535 ExecStart=/usr/bin/php /home/www/content_service/bin/hyperf.php start ExecStop=/usr/bin/sh /home/www/content_service/bin/stop.sh ExecReload=/bin/kill -USR1 $MAINPID Restart=always RestartSec=5s TimeoutStopSec=120s ``` stop.sh 伪代码 ```sh pid=$(cat ./runtime/hyperf.pid) echo $pid /bin/kill -USR1 $pid ``` /bin/kill -USR1 master_pid ```sh [root@prod-ali-hd2-content-service-2 ~]# systemctl status content.service ● content.service - content service Http Server Loaded: loaded (/home/thefair/www/content_service/bin/content.service; enabled; vendor preset: disabled) Active: active (running) since 三 2021-01-20 17:11:19 CST; 2min 42s ago Process: 30375 ExecStop=/usr/bin/sh /home/thefair/www/content_service/bin/stop.sh (code=exited, status=0/SUCCESS) Main PID: 30474 (php) CGroup: /system.slice/content.service ├─30474 content_service.Master ├─30481 content_service.Manager ├─30486 content_service.TaskWorker.4 ├─30487 content_service.TaskWorker.5 ├─30488 content_service.Worker.0 ├─30489 content_service.Worker.1 ├─30490 content_service.Worker.2 └─30491 content_service.Worker.3 1月 20 17:11:19 prod-ali-hd2-content-service-2 systemd[1]: Started content service Http Server. [root@prod-ali-hd2-content-service-2 ~]# systemctl restart content.service ``` ## 调试 `strace -p 30481 (manage pid)` ```sh [root@prod-ali-hd2-content-service-2 ~]# strace -p 30481 strace: Process 30481 attached wait4(-1, 0x7ffffb4c5268, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=30474, si_uid=0} --- close(6) = 0 open("/home/thefair/logs/www/content_service/service.error.txt", O_RDWR|O_CREAT|O_APPEND, 0666) = 5 --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} --- --- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=1, si_uid=0} --- --- SIGIO {si_signo=SIGIO, si_code=SI_USER, si_pid=30488, si_uid=0} --- rt_sigreturn({mask=[USR1 TERM]}) = 0 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=30487, si_uid=0, si_status=0, si_utime=0, si_stime=1} --- --- SIGIO {si_signo=SIGIO, si_code=SI_USER, si_pid=30490, si_uid=0} --- rt_sigreturn({mask=[USR1 TERM CHLD]}) = 0 rt_sigreturn({mask=[USR1 TERM]}) = 0 rt_sigreturn({mask=[USR1]}) = 5 rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call) clock_gettime(CLOCK_REALTIME, {1611134155, 277667141}) = 0 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=528, ...}) = 0 flock(5, LOCK_EX) = 0 write(5, "[2021-01-20 17:15:55 $30481.0]\tI"..., 72) = 72 flock(5, LOCK_UN) = 0 rt_sigaction(SIGALRM, {0x7fea01075ff0, [], SA_RESTORER, 0x7fea1758b5d0}, {0x7fea01075ff0, [], SA_RESTORER, 0x7fea1758b5d0}, 8) = 0 setitimer(ITIMER_REAL, {it_interval={6, 0}, it_value={6, 0}}, NULL) = 0 kill(30488, SIGTERM) = 0 kill(30489, SIGTERM) = 0 kill(30490, SIGTERM) = 0 kill(30491, SIGTERM) = 0 kill(30486, SIGTERM) = 0 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30486 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30820 kill(30487, SIGTERM) = 0 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30487 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30821 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30489 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30822 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30490 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30823 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30491 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30824 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30488 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=30488, si_uid=0, si_status=0, si_utime=1, si_stime=2} --- rt_sigreturn({mask=[]}) = 30488 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30839 wait4(-1, 0x7ffffb4c5268, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} --- rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call) setitimer(ITIMER_REAL, {it_interval={0, 1000}, it_value={0, 1000}}, NULL) = 0 wait4(-1, 0x7ffffb4c5268, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} --- rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call) kill(30491, SIG_0) = -1 ESRCH (No such process) kill(30490, SIG_0) = -1 ESRCH (No such process) kill(30489, SIG_0) = -1 ESRCH (No such process) kill(30488, SIG_0) = -1 ESRCH (No such process) kill(30487, SIG_0) = -1 ESRCH (No such process) kill(30486, SIG_0) = -1 ESRCH (No such process) setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 wait4(-1, <unfinished ...> +++ killed by SIGKILL +++ ``` ## 无法重启 在调度 manage 进程时,又fork了一个 worker 30839 进程,这是一个新的进程ID,导致无法重启,等到 TimeoutStopSec 120s 之后,systemctl kill -9 强制杀死 ```sh clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30839 ```
发布于5年前 · 4 次浏览 · 来自
提问
明志
# swoole 重启 版本:swoole 4.5.10 配置文件 service ```ini [Service] Type=simple LimitNOFILE=65535 ExecStart=/usr/bin/php /home/www/content_service/bin/hyperf.php start ExecStop=/usr/bin/sh /home/www/content_service/bin/stop.sh ExecReload=/bin/kill -USR1 $MAINPID Restart=always RestartSec=5s TimeoutStopSec=120s ``` stop.sh 伪代码 ```sh pid=$(cat ./runtime/hyperf.pid) echo $pid /bin/kill -USR1 $pid ``` /bin/kill -USR1 master_pid ```sh [root@prod-ali-hd2-content-service-2 ~]# systemctl status content.service ● content.service - content service Http Server Loaded: loaded (/home/thefair/www/content_service/bin/content.service; enabled; vendor preset: disabled) Active: active (running) since 三 2021-01-20 17:11:19 CST; 2min 42s ago Process: 30375 ExecStop=/usr/bin/sh /home/thefair/www/content_service/bin/stop.sh (code=exited, status=0/SUCCESS) Main PID: 30474 (php) CGroup: /system.slice/content.service ├─30474 content_service.Master ├─30481 content_service.Manager ├─30486 content_service.TaskWorker.4 ├─30487 content_service.TaskWorker.5 ├─30488 content_service.Worker.0 ├─30489 content_service.Worker.1 ├─30490 content_service.Worker.2 └─30491 content_service.Worker.3 1月 20 17:11:19 prod-ali-hd2-content-service-2 systemd[1]: Started content service Http Server. [root@prod-ali-hd2-content-service-2 ~]# systemctl restart content.service ``` ## 调试 `strace -p 30481 (manage pid)` ```sh [root@prod-ali-hd2-content-service-2 ~]# strace -p 30481 strace: Process 30481 attached wait4(-1, 0x7ffffb4c5268, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=30474, si_uid=0} --- close(6) = 0 open("/home/thefair/logs/www/content_service/service.error.txt", O_RDWR|O_CREAT|O_APPEND, 0666) = 5 --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} --- --- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=1, si_uid=0} --- --- SIGIO {si_signo=SIGIO, si_code=SI_USER, si_pid=30488, si_uid=0} --- rt_sigreturn({mask=[USR1 TERM]}) = 0 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=30487, si_uid=0, si_status=0, si_utime=0, si_stime=1} --- --- SIGIO {si_signo=SIGIO, si_code=SI_USER, si_pid=30490, si_uid=0} --- rt_sigreturn({mask=[USR1 TERM CHLD]}) = 0 rt_sigreturn({mask=[USR1 TERM]}) = 0 rt_sigreturn({mask=[USR1]}) = 5 rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call) clock_gettime(CLOCK_REALTIME, {1611134155, 277667141}) = 0 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=528, ...}) = 0 flock(5, LOCK_EX) = 0 write(5, "[2021-01-20 17:15:55 $30481.0]\tI"..., 72) = 72 flock(5, LOCK_UN) = 0 rt_sigaction(SIGALRM, {0x7fea01075ff0, [], SA_RESTORER, 0x7fea1758b5d0}, {0x7fea01075ff0, [], SA_RESTORER, 0x7fea1758b5d0}, 8) = 0 setitimer(ITIMER_REAL, {it_interval={6, 0}, it_value={6, 0}}, NULL) = 0 kill(30488, SIGTERM) = 0 kill(30489, SIGTERM) = 0 kill(30490, SIGTERM) = 0 kill(30491, SIGTERM) = 0 kill(30486, SIGTERM) = 0 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30486 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30820 kill(30487, SIGTERM) = 0 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30487 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30821 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30489 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30822 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30490 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30823 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30491 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30824 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 30488 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=30488, si_uid=0, si_status=0, si_utime=1, si_stime=2} --- rt_sigreturn({mask=[]}) = 30488 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30839 wait4(-1, 0x7ffffb4c5268, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} --- rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call) setitimer(ITIMER_REAL, {it_interval={0, 1000}, it_value={0, 1000}}, NULL) = 0 wait4(-1, 0x7ffffb4c5268, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} --- rt_sigreturn({mask=[]}) = -1 EINTR (Interrupted system call) kill(30491, SIG_0) = -1 ESRCH (No such process) kill(30490, SIG_0) = -1 ESRCH (No such process) kill(30489, SIG_0) = -1 ESRCH (No such process) kill(30488, SIG_0) = -1 ESRCH (No such process) kill(30487, SIG_0) = -1 ESRCH (No such process) kill(30486, SIG_0) = -1 ESRCH (No such process) setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 wait4(-1, <unfinished ...> +++ killed by SIGKILL +++ ``` ## 无法重启 在调度 manage 进程时,又fork了一个 worker 30839 进程,这是一个新的进程ID,导致无法重启,等到 TimeoutStopSec 120s 之后,systemctl kill -9 强制杀死 ```sh clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fea1ae47b50) = 30839 ```
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-01-21
明志
是我理解的有问题,我应该使用 SIGTERM 信号,不明白的是在 systemctl 里面 kill -USR1 主进程PID 会杀死 master 与 manage 进程 让我认为 fork worker 一个新进程是错误的,其实杀死 worker 进程, clone 新的才是正常的流程,现在反回过来了...
赞
0
回复
2021-01-21
序冢
回复
明志
你发送SIGUSR1之后,会更改mmap上的共享内存标记位,从而停止worker进程,然后manager会把worker来起来重载,SIGTERM会等待所有worker停止,停止完成后结束服务的运行
赞
1
回复
2021-01-22
Rango
回复
明志
如果直接杀死 worker 进程,在老的 worker 停止,新 worker 启动之间,会有部分请求积压无法被及时处理。 `Swoole`底层处理的方式是先启动新的 worker,新的请求由新的 worker 处理,老的 worker 进程自然消亡,退出。
赞
1
回复
2021-01-21
序冢
SIGUSR1是重载,请用SIGTERM
赞
0
回复