怎样使程序开机自启动和程序挂掉自动重启

碰到这个问题基本都是属于服务端工程部署的事情,在部署好我们的算法服务后怎样使程序开机自启动和程序挂掉自动重启,怎么样保证当服务器关机重启后,我们的算法服务自动重新运行?如果碰到异常bug使得我们的程序挂掉后,怎样让它重新运行?

下面方法都是在服务器环境:Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-161-generic x86_64)得到验证

目录

法一,用crontab定时执行sh脚本

用crontab每分钟执行sh脚本,这个sh脚本用于查询我们的算法服务进程是否还在,如果不在,则重启程序,反之,则不做任何操作

run.sh脚本如下:

  #!/bin/bash
ps -ef|grep "service_app.py"|grep -v grep
if [ $? -ne 0 ]
then
	cd /home/lishanlu/code/openmv_city
	nohup /home/lishanlu/anaconda3/envs/py36/bin/python service_app.py &
else
    echo "service_app.py is runing ..."
fi

在crontab中添加每分钟执行一次run.sh脚本,关于crontab的参数细节可见我的另一篇博客linux常用命令

程序运行自动让别人运行_如何让程序自动运行_程序运行自动关闭

在终端输入crontab -e

在文档末尾添加:

* * * * * /bin/bash /home/lishanlu/code/openmv_city/run.sh

如果需要让程序单纯只是开机自启动的话,就在文档末尾添加:

@reboot /bin/bash /home/lishanlu/code/openmv_city/run.sh

注意:

法二,用supervisor+gunicorn来启动我们的程序

参考:

程序运行自动让别人运行_程序运行自动关闭_如何让程序自动运行

1、 安装gunicorn

gunicorn主要解决高并发的问题,安装:

pip install gunicorn

使用gunicorn启动flask web服务:

gunicorn -w 4 service_app:app

-w代表启动的进程数如何让程序自动运行,service_app是我的python文件名,app是文件中的变量

2、安装supervisor

supervisor是一个进程管理系统,如果我们的进程异常中断,它可以帮我们重新启动

程序运行自动关闭_如何让程序自动运行_程序运行自动让别人运行

Ubuntu下安装方式如下:

sudo apt install supervisor

安装完成后,可以在/etc/supervisor目录下看到conf.d文件夹和一个supervisord.conf默认配置文件。我们可以打开看看这个supervisord.conf配置文件:

在这里插入图片描述

其中分号(;)后面是注释部分,最重要是文件最后两行

[include]
files = /etc/supervisor/conf.d/*.conf

说明怎样使程序开机自启动和程序挂掉自动重启,我们自己定义工程的supervisor配置文件可以直接放在conf.d文件夹下,并且要以*.conf的方式命名。

cd /etc/supervisor/conf.d
vim supervisor_openmv.conf

supervisor_openmv.conf配置文件的内容如下:

[program:openmv_server]  ; 程序名称,在supervisorctl中通过这个名称对程序进行一系列操作
user = lishanlu  ; 用哪个用户启动
process_name=%(program_name)s   ; 进程名字(默认写法)
numprocs=1   ; 开启的进程数量
directory = /home/lishanlu/code/openmv_city   ;程序的启动目录
command = /home/lishanlu/anaconda3/envs/py36/bin/gunicorn -w 4 service_app:app   ; 启动命令,与手动启动命令一致
autostart = true  ; 在supervisord启动的时候也自启动
startsecs = 20     ; 启动时间
autorestart = true  ; 程序异常退出的时候自动重启
startretries = 3    ; 启动失败自动重试次数,默认是3
redirect_stderr = true   ; 把stderr重定向到stdout,默认为False
stdout_logfile_maxbytes = 20MB   ; stdout 日志文件大小,默认为50M
stdout_logfile_backups = 10   ; stdout 日志文件备份数
stdout_logfile = logs/supervisor.log  ; stdout 日志文件,需手动先创建目录,不然无法正常启动

启动supervisor

sudo supervisord -c /etc/supervisor/supervisord.conf

然后用supervisorctl来操作守护的进程

supervisorctl常用命令:

1、重新启动配置中的所有程序 supervisorctl reload

2、启动某个进程 supervisorctl start your_program_name

程序运行自动让别人运行_如何让程序自动运行_程序运行自动关闭

3、查看正在守候的进程 supervisorctl status

4、停止某一进程 supervisorctl stop your_program_name

5、重启某一进程 supervisorctl restart your_program_name

6、停止全部进程 supervisorctl stop all

注意:

法三,将工程制作成docker镜像,通过运行容器时给定参数–restart always

用docker run启动容器时如何让程序自动运行,带上参数–restart always

也可以使用–restart unless-stopped,这样如果不是显式的 docker container stop xxx 就会在这个容器主进程挂掉之后自动重启。

法四,将写好的脚本(.sh文件)放到目录 /etc/profile.d/ 下,系统启动后就会自动执行该目录下的所有shell脚本

标签: crontab   sh 脚本   算法服务进程   重启程序   supervisor

留言评论