解决容器内运行laravel定时任务导致大量进程的问题
起因是内网服务器每隔一阵就会失去网络连接,而且外接键鼠也会没有反应。那必定是什么程序占用了大量系统资源,想想只有近期部署的horizon和schedule服务可能出现这个问题。直觉以为php artisan schedule:run
运行结束后就退出了,没有副作用。我便关注起horizon服务了,这反而让我踩了坑,因为僵尸进程恰恰就是schedule服务间接造成的。还是要经常打破思维惯性,常规之外总有意外。
在此说明下schedule服务的部署方式,方便大家与自身场景比对。laravel schedule中定义的任务都是runInBackground
模式。schedule服务是以容器内部的定时来运行的,即crond
是容器的init进程(pid 0),它根据我定义的crontabs文件,进一步调用schedule命令。直接造成僵尸进程的“罪魁祸首”便是有些无辜的crond了。我仿佛听到它一脸无辜地申辩:我不知道啊!言归正传,下面记录了僵尸进程的发现和解决方法。