Mac OSX 开机启动应用

本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html

本文做者: 苏洋python

建立时间: 2019年03月11日 统计字数: 4709字 阅读时间: 10分钟阅读 本文连接: https://soulteary.com/2019/03/11/mac-osx-starts-up-applications-supervisor.htmlgit


Mac OSX 开机启动应用

Mac OSX 的稳定性一贯不错,不管是用于跑基于 XCode 的 CI,仍是用于作简单的 HomeLab 使用,都能知足需求。github

可是在日程使用中,不免出现系统维护须要重启、应用遇到问题崩溃退出运行,这个时候,就不得不引用进程管理工具来帮助咱们进行应用的开机启动或者进程退出重启了。编程

本篇文章将花十分钟左右介绍如何简单优雅的对 Mac 进行程序开机启动、运行保护,先从开机启动聊起。浏览器

关于 Mac OSX 系统的开机启动

提及 Mac 的开机启动,一般绕不开 LaunchDaemonsLaunchAgentLogin ItemStartup ItemsAppHelper 等关键词。ruby

凡是折腾过应用开机启动的同窗,必定对上面的关键词很清楚,手写 plst 是基础要求,若是想用户不登陆自动启动应用,可能还须要小写一段代码,编译成应用的 Helperbash

有没有既好用,又没必要这么硬核的应用启动方案呢?app

使用 Supervisor

这里依旧推荐 Supervisor,早些时候,我曾不止一次的推荐过这款开源应用,它不光活跃在各大互联网公司的生产环境中,还可以运行在各类开发、线下环境中,而且会主动适配各类环境。python2.7

快速安装 Supervisor

在 Mac OSX 环境中,若是想快捷安装它,须要先安装 brew (一句话安装)。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
复制代码

安装完毕以后,执行下面的命令,即可以安装好 supervisor 以及配套的 services 应用。

brew install supervisor
brew install services
复制代码

安装完毕以后,只须要执行下面的命令即可以启动 supervisor

brew services start supervisor
复制代码

若是进程已经执行,你将会受到下面的提示,能够忽略掉。

Service `supervisor` already started, use `brew services restart supervisor` to restart.
复制代码

若是你想关闭 supervisor,只须要将上面的参数替换为 stop 便可。

brew services stop supervisor
复制代码

配置 Supervisor

安装完毕以后,咱们的默认配置会保存在下面的位置。

/usr/local/etc/supervisord.ini
复制代码

虽然咱们最常使用命令行的方式对 supervisor 进行操做,可是它一样提供了一个更简单的方式进行进程的管理和查看:Web 界面。

浏览上面的配置文件,你将会看到这么一段被注释掉的配置。

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)
复制代码

若是不在公网开放,仅供本机进行调试维护,能够将头两行配置前的注释符号 ; 去掉,变成下面的样子:

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)
复制代码

接着执行下面的命令,重启 supervisor ,让配置生效。

brew services reload supervisor
复制代码

验证 HTTP 管理界面的方式很简单,打开浏览器,访问 http://127.0.0.1:9001 便可,或者使用 lsof 命令也能够快速验证服务是否正常,若是你也看到相似下面的命令行输出,那么服务就很轻松愉快的跑起来了。

soulteary in ~ λ lsof -i:9001
COMMAND    PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Google    5388 soulteary   34u  IPv4 0x2fed8630edccdf51      0t0  TCP localhost:49785->localhost:etlservicemgr (ESTABLISHED)
Google    5388 soulteary   45u  IPv4 0x2fed8630ee723c51      0t0  TCP localhost:49786->localhost:etlservicemgr (ESTABLISHED)
Google    5388 soulteary   50u  IPv4 0x2fed8630ee5165d1      0t0  TCP localhost:49787->localhost:etlservicemgr (ESTABLISHED)
python2.7 7593 soulteary    5u  IPv4 0x2fed8630edccf251      0t0  TCP localhost:etlservicemgr (LISTEN)
python2.7 7593 soulteary    8u  IPv4 0x2fed8630edccd5d1      0t0  TCP localhost:etlservicemgr->localhost:49785 (ESTABLISHED)
python2.7 7593 soulteary    9u  IPv4 0x2fed8630ec024c51      0t0  TCP localhost:etlservicemgr->localhost:49786 (ESTABLISHED)
python2.7 7593 soulteary   10u  IPv4 0x2fed8630ec027251      0t0  TCP localhost:etlservicemgr->localhost:49787 (ESTABLISHED)
复制代码

若是此刻你重启设备,等待设备重启完成,除了使用 ps -ef 检查 supervisor 是否运行以外,使用浏览器打开 127.0.0.1:9001 也是同样的。

Web Dashboard 界面

日志是应用执行过程当中宝贵的财富,因此要将 supervisor 的日志好好保存,默认配置中,日志会保存在下面的地方,根据本身的状况将日志挪到便于管理的地方吧,若是作了修改,也别忘记要重启进程,方法上面交代过了。

[supervisord]
logfile=/usr/local/var/log/supervisord.log ; main log file; default $CWD/supervisord.log
复制代码

继续浏览配置文件,不难发现 Supervisor 默认会自动读取 /usr/local/etc/supervisor.d/ 目录下全部的 ini 文件。

[include]
files = /usr/local/etc/supervisor.d/*.ini
复制代码

考虑到可维护性,咱们要对它进行一些修改,将启动配置“就近保存”在须要被启动的应用的目录内,好比 ~/Service/example 中,好比这样。

[include]
files = /Users/soulteary/Service/*/conf/supervisor.ini
复制代码

进行应用验证

接下来咱们将编写一个简单的脚原本对 supervisor 进行进程启动和守护的能力验证。

先准备一个项目目录。

mkdir -p ~/Service/example
复制代码

在目录中建立一个名为 test.sh 的脚本,内容以下:

#!/usr/bin/env bash 
python -m SimpleHTTPServer 8080
复制代码

赋予脚本执行权限以后,咱们能够运行这个脚本。

chmod +x test.sh
./test.sh
复制代码

当你打开浏览器,访问 127.0.0.1:8080,你将会看到一个使用 Python 运行的 Web Server。

Web Server 界面

在项目目录中建立一个 conf 文件夹,用来存放 supervisor 程序的配置文件。

mkdir conf
touch conf/supervisor.ini
复制代码

配置文件内容示例:

[program:test]
; 启动目录
directory = /Users/soulteary/Service/example/
; 执行命令
command = /Users/soulteary/Service/example/test.sh
; 随 supervisord 启动
autostart = true
; 程序启动 5s 内没有异常则认为是正常运行
startsecs = 5
; 程序异常退出后从新启动
autorestart = true
; 重试启动程序多少次
startretries = 3
; 默认使用当前用户执行应用
user = soulteary
; 须要手动建立目录
stdout_logfile = /Users/soulteary/Service/log/supervisor.log
复制代码

重启 supervisor 后,使用浏览器或者 ps 验证,Web Server 运行了起来,说明 supervisor 是可以启动进程的。

在验证 supervisor 是否可以守护进程,须要关闭当前 Web Server 进程,先使用命令行获取当前进程 PID 。

ps -ef | grep test.sh | grep -v grep | awk '{print $2}'
复制代码

举个例子,此处 PID 显示 1529 ,接下来咱们执行下面的命令,进行进程杀除,此时浏览器中的站点应该已经打不开了。

ps -ef | grep test.sh | grep -v grep | awk '{print $2}' | xargs -I {} kill {}
复制代码

稍等片刻,刷新浏览器,Web 服务又被启动了起来,再次执行第一条命令,能够看到进程 PID 已经变化,说明 supervisor 已经配置完毕。

固然,supervisor 也提供了一套简单好用的命令给用户使用,好比可使用下面的命令查看当前须要被守护的应用的运行状态:

supervisorctl status
test                             RUNNING   pid 1629, uptime 0:04:21
复制代码

更多命令,请自行查询文档,这里就不赘述了。固然,你也能够从 Web 界面查看当前应用是否成功运行。

使用 Web Status 查看进程状态

最后

若是你对本文描述内容不是很熟悉,能够翻阅以往的文章,补全对上述技术的认识,但愿个人文章对你有所帮助。

— EOF


我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。

在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)

关于折腾群入群的那些事

相关文章
相关标签/搜索