详解程序意外中断自动重启shell脚本(以Python为例)


Posted in Python onJuly 26, 2019

我们经常需要在后台运行一些python脚本,来监控系统或者做一些其他事情;但是 由于各种各样的原因,排除python脚本代码的问题,脚本运行过程中会挂掉。为了不天天耗在上面等重启,可以制作shell脚本对程序予以监控,对于意外中断的程序自动重启。

以控制 python自动重启的shell脚本为例:

cd Desktop
vim run.sh #新建名为run的shell脚本

写入(此处以名为run的Python脚本为例)

#!/bin/bash
while [ 1 ];do
 python run.py
done
chmod 777 run.sh #设置shell脚本权限
./run.sh   #运行shell脚本

详解程序意外中断自动重启shell脚本(以Python为例)

详解程序意外中断自动重启shell脚本(以Python为例)

可见Python脚本意外中断(被kill)后,由于shell脚本的循环语句,实现了自动重启。

详解程序意外中断自动重启shell脚本(以Python为例)

在测试完确保能够正常运行后,切换为后台运行:关于后台运行命令原理,点此查看。

nohup ./run5.py &

详解程序意外中断自动重启shell脚本(以Python为例)

此外,做爬虫项目时,我们需要考虑一个爬虫在爬取时会遇到各种情况(网站验证,ip封禁),导致爬虫程序中断,这时我们已经爬取过一些数据,再次爬取时这些数据就可以忽略,所以我们需要在爬虫项目中设置一个中断重连的功能,使其在重新运行时从之前断掉的位置重新爬取数据。此代码参见自 匡虐博客

import os
class UrlManager(object):
 def __init__(self):						#建立两个数组的文件
  with open('new_urls.txt','r+') as new_urls:
   self.new_urls = new_urls.read()
  with open('old_urls.txt','r+') as old_urls:
   self.old_urls = old_urls.read()

 def add_new_url(self, url): 				 #添加url到new_ulrs文件中
  if url is None:
   return
  if url not in self.new_urls and url not in self.old_urls:
   with open('new_urls.txt', 'a') as new_urls:
    new_urls.write(url)
  else:
   print('url had done')

 def add_new_urls(self, urls):				#添加多个url到new_ulrs文件中
  # if urls is None or (len(url) == 0 for url in urls):
  if urls is None:
   print('url is none')
   return
  for url in urls:
   if urls is None:
    print('url is none')
    return
   else:
    self.add_new_url(url)

 def has_new_url(self):
  return len(self.new_urls) != 0

 def get_new_url(self):				
  new_url = get_last_line('new_urls.txt') 	#读取new_urls文件中最后一个url
  del_last_url('new_urls.txt',new_url)		#删除new_urls文件中最后一个url
  add_old_urls('old_urls.txt',new_url)		#将读取出来的url添加入old_urls数组中
  return new_url

	def get_last_line(inputfile):
	 filesize = os.path.getsize(inputfile)
	 blocksize = 1024
	 dat_file = open(inputfile, 'rb')
	
	 last_line = b""
	 lines = []
	 if filesize > blocksize:
	  maxseekpoint = (filesize // blocksize) # 这里的除法取的是floor
	  maxseekpoint -= 1
	  dat_file.seek(maxseekpoint * blocksize)
	  lines = dat_file.readlines()
	  while ((len(lines) < 2) | ((len(lines) >= 2) & (lines[1] == b'\r\n'))): # 因为在Windows下,所以是b'\r\n'
	   # 如果列表长度小于2,或者虽然长度大于等于2,但第二个元素却还是空行
	   # 如果跳出循环,那么lines长度大于等于2,且第二个元素肯定是完整的行
	   maxseekpoint -= 1
	   dat_file.seek(maxseekpoint * blocksize)
	   lines = dat_file.readlines()
	 elif filesize: # 文件大小不为空
	  dat_file.seek(0, 0)
	  lines = dat_file.readlines()
	 if lines: # 列表不为空
	  for i in range(len(lines) - 1, -1, -1):
	   last_line = lines[i].strip()
	   if (last_line != b''):
	    break # 已经找到最后一个不是空行的
	 dat_file.close()
	 return last_line
	
	def del_last_url(fname,part):
	 with open(fname,'rb+') as f:
	  a = f.read()
	 a = a.replace(part,b'')
	 with open(fname,'wb+') as f:
	  f.write(a)
	  
	def add_old_urls(fname,new_url):
	 line = new_url + b'\r'
	 with open(fname,'ab') as f:
	  f.write(line)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python自动化测试之连接几组测试包实例
Sep 28 Python
Python 递归函数详解及实例
Dec 27 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
python的scipy实现插值的示例代码
Nov 12 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
Django app配置多个数据库代码实例
Dec 17 Python
详解python datetime模块
Aug 17 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
利用python做表格数据处理
Apr 13 Python
python的pstuil模块使用方法总结
Jul 26 #Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 #Python
python通过http下载文件的方法详解
Jul 26 #Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 #Python
Python调用C语言的实现
Jul 26 #Python
Python实现的企业粉丝抽奖功能示例
Jul 26 #Python
对Django外键关系的描述
Jul 26 #Python
You might like
用PHP编程开发“虚拟域名”系统
2006/10/09 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
Python 第一步 hello world
2009/09/25 Python
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
Numpy之文件存取的示例代码
2018/08/03 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
EJB的基本架构
2016/09/22 面试题
《陋室铭》教学反思
2014/02/26 职场文书
销售人员职业生涯规划范文
2014/03/01 职场文书
环保建议书300字
2014/05/14 职场文书
销售提升方案
2014/06/07 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
MySql开发之自动同步表结构
2021/05/28 MySQL