使用systemd做进程守护服务,服务的脚本是一个docker进程,执行php脚本,在使用的时候发现启动docker会出现报错Start request repeated too quickly本文地址:http://www.04007.cn/article/818.html,未经许可,不得转载.
#systemd服务中的service进程服务配置如下: user@u04007:/etc/systemd/system$ sudo vim 04007ser.service [Service] Type=forking ExecStart=/usr/bin/docker exec -d phpnet /usr/local/bin/php /var/www/www/index.php lark show test_env ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true Restart=always .... user@u04007:/etc/systemd/system$ sudo systemctl daemon-reload user@u04007:/etc/systemd/system$ sudo systemctl start 04007ser.service user@u04007:/etc/systemd/system$ sudo systemctl status 04007ser.service ● 04007ser.service - 04007ser Loaded: loaded (/etc/systemd/system/04007ser.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Mon 2020-06-01 10:54:31 CST; 8s ago Process: 1671350 ExecStart=/usr/bin/docker exec php /usr/local/bin/php /var/www/www/index.php c a (code=exited, status= CPU: 141ms Jun 01 10:54:31 n8-022-053 systemd[1]: 04007ser.service: Unit entered failed state. Jun 01 10:54:31 n8-022-053 systemd[1]: 04007ser.service: Start request repeated too quickly.
从现象推测,使用systemd守护docker下的容器进程,容器带上-d参数表示后台执行,此进程执行后,实际已看不到docker进程,而真正执行的只是php的进程在跑,可以使用ps查看。因此使用systemd守护docker下的容器进程启动后,systemd会认为docker进程执行后便退出了,于是会循环重复去启动docker进程,从而出现Start request repeated too quickly的问题最终使用systemd服务失败。
于是我尝试使用如下的方法,加上nohup,而不再使用docker的-d选项,同时dotest方法逻辑为循环输出10次(间隔1秒),10次输出后便退出程序,来测试这样的守护进程,service配置文件中的ExecStart配置如下:
ExecStart=/usr/bin/nohup /usr/bin/docker exec php /usr/local/bin/php /var/www/www/index.php show dotest
这样配置后,可以看到start启动04007ser.service之后,服务能正常运转,dotest方法输出10次后退出,然后systemd检测到进程退出从而重新启动docker进程,观察没有问题。不过当我将dotest方法的逻辑改成不自动退出,或者加长一些时间再这样执行时,发现有新的情况出现。有报错:Start operation timed out和Service hold-off time over如下:本文地址:http://www.04007.cn/article/818.html,未经许可,不得转载.
Jun 02 17:37:56 n8-022-053 systemd[1]: 04007ser.service: Start operation timed out. Terminating. Jun 02 17:37:56 n8-022-053 systemd[1]: Failed to start 04007ser. Jun 02 17:37:56 n8-022-053 systemd[1]: 04007ser.service: Unit entered failed state. Jun 02 17:37:56 n8-022-053 systemd[1]: 04007ser.service: Failed with result 'timeout'. Jun 02 17:37:56 n8-022-053 systemd[1]: 04007ser.service: Service hold-off time over, scheduling restart. Jun 02 17:37:56 n8-022-053 systemd[1]: Stopped 04007ser. Jun 02 17:37:56 n8-022-053 systemd[1]: Starting 04007ser... Jun 02 17:38:16 n8-022-053 systemd[1]: Stopped 04007ser.
上面的问题有两个方面,一方面是任务没有放到后台运行,所以报错Start operation timed out。针对上面的情况在最后加上一个&放后台执行看看:
ExecStart=/usr/bin/nohup /usr/bin/docker exec php /usr/local/bin/php /var/www/www/index.php show dotest &本文地址:http://www.04007.cn/article/818.html,未经许可,不得转载.
#执行过程中service会Service hold-off time over Jun 02 18:09:32 n8-022-053 systemd[1]: 04007ser.service: Control process exited, code=exited status=143 Jun 02 18:09:32 n8-022-053 systemd[1]: Failed to start 04007ser. Jun 02 18:09:32 n8-022-053 systemd[1]: 04007ser.service: Unit entered failed state. Jun 02 18:09:32 n8-022-053 systemd[1]: 04007ser.service: Failed with result 'exit-code'. Jun 02 18:09:32 n8-022-053 systemd[1]: 04007ser.service: Service hold-off time over, scheduling restart. Jun 02 18:09:32 n8-022-053 systemd[1]: Stopped 04007ser. Jun 02 18:09:32 n8-022-053 systemd[1]: Starting 04007ser...
可以发现执行过程中service会Service hold-off time over报错,在上面的报错过程中systemd会再启动一次docker进程,而之前的php进程仍然存在,会导致php进程会一直被docker启动的php进程占满的问题。看来用systemd来配置docker中的容器进程时还需要再看看其它的文档配置,我今天就到这里吧,估计后面还会要看一下systemd中的配置顶比如Type,以及配置RestartSec等看是否有hold-off time的时间值配置。肯定不缺解决办法,实在次之就自己写个shell操作start/restart这个进程。然后让systemd监控这个shell脚本即可。本文地址:http://www.04007.cn/article/818.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/818.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |