th5.1 队列使用守护进程

起因

公司项目使用到了redis队列, 使用队列就会遇到队列被干掉的情况, 所以需要使用守护进程

过程

当项目上线之后, 需要在子项目根目录启动队列

php think queue:listen

但是这种写法, 一旦窗口关闭, 队列就会取消, 所以我就想了一个取消救国的方法, 让它在后台运行

nohup php think queue:listen 2 > &1 &

使用nohup 可以是该命令在后台运行,并把所有输出都被重定向到一个名为nohup.out的文件中

但是这样做还是避免不了 这个进程意外关闭或者因为其他原因死掉

所以最好还是选择使用守护进程

第一步:在centos上安装守护进程supersivor

# yum install epel-release
# yum install supervisor -y
//设置成开机自动启动
# systemctl enable supervisord

第二步:设置守护进程的运行目录,日志目录,配置文件

守护进程有自己默认的运行目录,日志目录, 但是为了管理方便, 我们可以自己设置这些目录

cd /var/
mkdir supervisor
cd supervisor/
mkdir run  # 运行目录
mkdir log  # 日志目录
mkdir conf # 配置目录 也是需要执行的命令的配置目录

第三步:修改配置文件

配置文件在 /etc/supervisord.conf

; 将supervisor.sock 的路径换成如下
[unix_http_server]
file=/var/supervisor/run/supervisor.sock   ; (the path to the socket file)

; 将supervisord.log 和 supervisord.pid 的路径换成如下
[supervisord]
logfile=/var/supervisor/log/supervisord.log  ; (main log file;default $CWD/supervisord.log)
pidfile=/var/supervisor/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

; 将supervisor.sock 的路径换成如下
[supervisorctl]
serverurl=unix:///var/supervisor/run/supervisor.sock ; use a unix:// URL  for a unix socket

; 将最底部的files路径换成如下  配置文件的目录
[include]
files = /var/supervisor/conf/*.conf

第四步:配置自己需要运行的命令 在自己创建的配置目录下 /var/supervisor/conf

这一步需要特别注意

一般网上的提供的配置文件如下

但是这样写会报一些错误, 例如目录找不到啊 不是一个有效的布尔值啊 之类的

cd /var/supervisor/conf
vim work_queue.conf

# 插入代码
[program:queue_worker] ;项目名称
directory = /var/tp5.1 ; 程序的启动目录,项目根目录的上一级
command = php think queue:listen ; 启动命令
process_name=%(program_name)s_%(process_num)02d
numprocs = 3         ; 开启的进程数量
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true   ; 程序异常退出后自动重启
startretries = 3     ; 启动失败自动重试次数,默认是 3
user = root          ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
; stdout 日志文件,需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/supervisor/log/queue_worker.log
loglevel=info

经过亲自验证,在启动守护进程时需要将上面的配置的注释以及 ‘;’ 去掉

# 插入代码
[program:queue_worker]
directory=/var/tp5.1
command=php think queue:listen
process_name=%(program_name)s_%(process_num)02d
numprocs=3
autostart=true
startsecs=5
autorestart=true
startretries=3
user=root
redirect_stderr=true
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=20
stdout_logfile=/var/supervisor/log/queue_worker.log
loglevel=info

第五步:启动守护进程

systemctl start supervisord

systemctl stop supervisord
systemctl restart supervisord

第六步:测试

可以打开日志文件 /va/supervisor/log/  查看日志  是否报错

也可以使用 ps 查看命令是否运行  ps -aux|grep php

第七步:提示

如果你有多个项目怎么半,特别是在测试环境, 一般都时多个项目在测试服务器

这个时候只需要在 /var/supervisor/conf/ 下增加一个配置文件即可

文件内容需要修改 项目目录  日志文件名称 等

结束

很多东西只看是看不会的,需要亲自操作一遍,才发现有些事情是我们想的复杂了, 更多的是 事情并不像我们想象的那么简单

原文地址:https://www.cnblogs.com/baozi-tudou/p/12690420.html

时间: 2024-10-14 14:40:14

th5.1 队列使用守护进程的相关文章

laravel队列-让守护进程处理耗时任务

待解决的问题 最近在做一个服务器集群管理的web项目,需要处理一些极其耗时的操作,比如磁盘格式化分区.对于这个需求,最开始的想法是,为了让节点上的rpc(远程过程调用) service端尽可能简单(简单到只需要popen执行一条指令即可,有时间我再专门写一篇博客讲讲这个项目的rpc是如何实现的),我们选择了让web端直接等待处理结果,那么问题来了,如何保证用户不必等待,又能保证任务准确的执行呢? 简单的rpc结构如下图 以往在处理一些稍微耗时的操作,可以通过优化代码结构,优化数据库操作次数,起一

PHP高级编程之守护进程,实现优雅重启

PHP高级编程之守护进程 http://netkiller.github.io/journal/php.daemon.html Mr. Neo Chen (陈景峰), netkiller, BG7NYT 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755 29812080 <[email protected]> 版权 ? 2014 http://netkiller.github.io 版权声明 转载请与作者联系,转载时请务必标明文章原始出处和

linux 脚本--守护进程

#/bin/bash #队列的守护进程 Date = `date +"%F-%H:%M:%S"` XMML = "/var/www/html/xiangmu" project= "src.plan" log = "RIZHI" num = `ps aux|grep ${project}|grep -V 'grep'|wc -l` if [$num -eq 1] then echo "${Date}队列进程ok&quo

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

守护进程,模拟抢票例子,互斥锁,信号量,队列总结

 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 # 守护进程 from multiprocessing import Process import os,time,random def task(): print('%s

python并发编程基础之守护进程、队列、锁

并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ? def task(): print('妃子的一生') time.sleep(15) print('妃子死了') ? if __name__ == '__main__': fz = Process(target=task) fz.daemon = True #将子进程作为主进程的守护进程.必须在

守护进程,互斥锁,IPC,队列,生产者与消费者模型

小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某个任务,然而,如果主进程认为自己的事情一旦做完了就没有必要使用子进程了,就可以将子进程设置为守护进程 例如:在运行qq的过程,开启一个进程,用于下载文件,然而文件还没有下载完毕,qq就退出了,下载任务也应该跟随qq的退出而结束. from multiprocessing import Process

python并发编程(守护进程,进程锁,进程队列)

进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate()  给操作系统发送一个结束进程的信号 验证进程之间是空间隔离的 from multiprocessing import Process num = 100 def f1(): global num num = 3 print(num) # 结果 3 if __name__ == '__main__

进程对象的其他方法、守护进程、使用多进程实现 socket tcp协议 server端的并发(抢票程序)、队列、进程之间的通信(IPC)

# 进程对象的其他方法 from multiprocessing import Process import time class MyProcess(Process): def __init__(self, a, b): # 为了给子进程传递参数 super().__init__() self.a = a self.b = b def run(self): print("子进程开始执行") time.sleep(2) print("子进程结束", self.a,