使用 systemd 运行 Horizon

使用 systemd 运行 Horizon

Horizon Systemd.png

Horizon 可以轻松的处理 Laravel Redis 队列,并且能够很容易的监控任务的指标。
在官方文档中,Horizon 使用 Supervisor 来作为进程管理器。
最近几年的 Linux 基本都开始采用 systemd 来管理进程,我们再也不用写麻烦的 init 脚本了。本文就教你怎么用 systemd 来启动 Horizon。

首先要知道一个概念 Unit(单元),systemd 中所有可以管理的资源统称为 Unit。Unit 分为 12 种,比如 service、target、device、mount、timer……,我们要用到的就是这个 service。

我们创建的 service 文件会放在 /etc/systemd/system/ 目录下,现在就开始写 service 文件吧。

vim /etc/systemd/system/horizon.service

以下是写好的 service 文件,⚠️注意修改工作目录

[Unit]
# 描述
Description=Laravel Horizon
# 表明本服务要在 mysql 和 redis 之后启动,Laravel 依赖 mysql,Horizon 依赖 redis
After=mysqld.service redis-server.service

[Service]
# !!!这里修改为laravel项目根目录
WorkingDirectory=/project/laravel/root
# 这里可以指定运行的用户
User=www
Group=www
# 启动命令,php 建议使用绝对路径
ExecStart=/usr/bin/php artisan horizon
# 停止命令,使用 horizon 提供的优雅停止方法
ExecStop=/usr/bin/php artisan horizon:terminate
# 可以控制服务在什么情况下重新启动,这里设置为异常退出时重新启动
Restart=on-failure
# 重新启动的前等待的时间
RestartSec=30s
# 指定正确退出的代码,一些没有处理 TERM 信号的程序退出代码会是 143 ,Horizon 的退出代码是 0
SuccessExitStatus=0

[Install]
# 指定在 多用户 模式下启动,就是一般的命令行模式啦,也包括图形界面模式
WantedBy=multi-user.target

改好之后保存一下 :wq
然后重新加载配置文件:

systemctl daemon-reload

现在来启动服务:

systemctl start horizon.service

正常启动之后是不会有输出的,我们可以通过 status 命令来查看状态:

systemctl status horizon.service

file

看到绿色的 running 了吗,那就是正常运行了,下面可以看到启动的进程情况,这里是三个默认的 work 进程。

如果更新了代码,我们可以使用 restart 命令来重启 Horizon 进程,使用新的代码运行:

systemctl restart horizon.service

使用 enable 命令可以指定服务开机启动:

systemctl enable horizon.service

这样下次重启的时候 Horizon 就自己启动啦~

如果不再需要自动启动,那就用 disable 命令:

systemctl disable horizon.service

当然 disable 命令并不会马上停止正在运行的服务,它只是让服务在下次开机的时候不自动启动,我们可以使用 stop 命令来直接停止正在运行服务:

systemctl stop horizon.service

最后还有个查看 systemd 的日志的命令 journalctl
我们可以这样查看一个服务输出的日志:

journalctl -u horizon.service

加上参数 -f 可以看到实时输出的日志。

file

本作品采用《CC 协议》,转载必须注明作者和本文链接
Laravel YES !
本帖由系统于 5年前 自动加精
wkan
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

赞赞赞, 但是我们这还是都要的 supervisor

5年前 评论

这确实方便多了。

5年前 评论

可以,很强

3年前 评论
wenber

如果确认服务的正确退出代码呢?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!