碰到这个问题基本都是属于服务端工程部署的事情,在部署好我们的算法服务后,怎么样保证当服务器关机重启后,我们的算法服务自动重新运行?如果碰到异常bug使得我们的程序挂掉后,怎样让它重新运行?
下面方法都是在服务器环境:Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-161-generic x86_64)得到验证

目录

  • 法一,用crontab定时执行sh脚本
  • 法二,用supervisor+gunicorn来启动我们的程序
  • 法三,将工程制作成docker镜像,通过运行容器时给定参数--restart always
  • 法四,将写好的脚本(.sh文件)放到目录 /etc/profile.d/ 下,系统启动后就会自动执行该目录下的所有shell脚本

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

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

  #!/bin/bash
ps -ef|grep "service_app.py"|grep -v grep
if [ $? -ne 0 ]
thencd /home/lishanlu/code/openmv_citynohup /home/lishanlu/anaconda3/envs/py36/bin/python service_app.py &
elseecho "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

注意:

  • 1、sh脚本中,如果运行程序需要用到虚拟环境,最好用绝对路径指定
  • 2、sh脚本中,程序的路径也用绝对路径
  • 3、用crontab执行sh脚本,如果py程序中需要访问一些系统命令,例如ifconfig,lsblk等,最好也在程序中用绝对路 径/sbin/ifconfig,/bin/lsblk,不然会存在找不到命令的情况。
  • 4、如果遇到启动不了,可以加入打印日志看看,* * * * * /bin/bash /home/lishanlu/code/openmv_city/run.sh >> /home/lishanlu/code/openmv_city/crontab_log.log

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

参考:https://blog.csdn.net/guolindonggld/article/details/83386920
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

注意:

  • 1、 用supervisord管理进程时,gunicorn的daemon选项需要设置为False
  • 2、如果启动命令包含虚拟环境,需修改environment参数:
    environment=PATH=“/home/username/.virtualenvs/bin”
  • 3、如果报错“Error: .ini file does not include supervisord section”,这是由于在我们的配置文件中缺少两个固定模块造成的,需要在我们的配置文件中加上[supervisord]和[supervisorctl]

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

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

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

怎样使程序开机自启动和程序挂掉自动重启相关推荐

  1. 用C语言设置程序开机自启动

    ``当需要使某一程序在开机时就启动它,需要把它写进注册表的启动项中. 下面就展示一种简单的写法: #include <windows.h> #include <stdlib.h> ...

  2. 使用robot-upstart开机自启动ROS程序

    使用robot-upstart开机自启动ROS程序 1.环境 2.说明 3.安装robot-upstart 4.编写launch文件 5.添加自启动任务 6.upstart问题及其他事项 6.1 自启 ...

  3. VC++程序开机自启动(注册表上注册)

    //实现程序开机自启动,在注册表上注册 BOOL CClientTracerDlg::autoRun() {  HKEY   RegKey;  LPCSTR KeyPath="Softwar ...

  4. android软件自动启动软件下载,Android编程实现应用程序开机自启动的方法

    本文实例讲述了Android编程实现应用程序开机自启动的方法.分享给大家供大家参考,具体如下: Android在开机时自动启动一个应用程序 在启动时自动启动一个应用程序: 1.AndroidManif ...

  5. 设置python程序开机自启动

    设置python程序开机自启动 1.创建一个xxx.bat文件,右键编辑 2.在xxx.bat文件里面写入以下内容后保存: d: #如果需要开机自启动的python程序在c盘,不需要这一行程序:如果需 ...

  6. ABB机器人线速度_ABB机器人设置程序开机自启动

    更多内容请点击上方 ABB机器人实战技巧 关注 也可点击公众号下方 往期经典 浏览更多内容 1)一些程序需要开机初始化,可以开机自启动.(程序内不要有运动指令) 2)记住例行程序名称,比如routin ...

  7. ubuntu18.04程序开机自启动

    1.检查系统目录/lib/systemd/system/rc-local.service,如果没有自己新建,文件内容如下图所示(如果文件存在本身是没有[Install]项的,需要自己添加进去) cd ...

  8. 树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱

    树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱 树莓派开机自启动Python并发送IP地址到指定邮箱 环境 用Python发送邮件 获取WIFI的IP地址 整合发送邮件和获取WIF ...

  9. Windows程序开机自启动

    开机自启动的两种方式 在Windows中想要开机自启动某些应用,可以把程序的快捷方式放到开始菜单->程序->启动目录下,但是自启动又分为用户自启动和系统自启动,前者针对单个用户,后者针对全 ...

最新文章

  1. 企业运维之域控篇(十)--SERVER 2003 迁移到 SERVER 2008 (异机)
  2. 有人能用外行人解释什么是JSONP吗? [重复]
  3. mysql在mac下的data目录_Mysql在mac中目录结构用法命令
  4. 程序员需要能show出来!
  5. ASP.NET Core 3.0中支持AI的生物识别安全
  6. [html] 如何禁用掉a标签的默认事件?
  7. [ MSSQL ]分页排序存储过程
  8. Cocos2d-x 多分辨率适配完全解析
  9. 《完美软件》读书笔记10:有关测试的主要误区
  10. 大数据平台应用开发的痛点有哪些
  11. STC单片机免冷启/自动下载原理DIY免冷启烧录器(纯硬件版和软件版)
  12. lisp型材库_STMX 1.3.2 发布,高性能的 Common Lisp 库
  13. 考研经验-东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)
  14. c语言编写cad建筑画图程序,CAD建筑平面图绘图步骤试题.doc
  15. html向下三角箭头,CSS 实现三角形尖角箭头的实例
  16. 第一性原理:戳中问题本质的人是怎么思考的?
  17. win10 系统识别不了移动硬盘
  18. 【中医学】0 绪论 + 1 阴阳五行学说
  19. R packages:fNonlinear———bdsTest——BDS检验
  20. 浅析贝叶斯神经网络(Based on Variational Bayesian)

热门文章

  1. python上台阶问题_Python解决N阶台阶走法问题的方法
  2. Anaconda 创建虚拟环境失败解决办法
  3. Linux安装IPFS
  4. Android 计步器实现
  5. python--元组tuple
  6. JavaScript 算法与数据结构 之 正则表达式
  7. 选择数字IC行业,就一定要读研吗?
  8. xset 关闭屏幕保护-关闭节电模式
  9. 企业如何做好电子邮件营销?做好这4点,客户回头率高!
  10. 项目讲解-AVM 3D 全景泊车-畸变矫正(1)