详解程序意外中断自动重启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绘图库Matplotlib的安装
Jul 03 Python
简单介绍Python中的floor()方法
May 15 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
Python PO设计模式的具体使用
Aug 16 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
python Shapely使用指南详解
Feb 18 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
python数据分析工具之 matplotlib详解
Apr 09 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中文竖排转换实现方法
2015/10/23 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
input的focus方法使用
2010/03/13 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
园林设计师自荐信
2013/11/18 职场文书
同事打架检讨书
2014/02/04 职场文书
早会主持词
2014/03/17 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
银行实习推荐信
2015/03/27 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
Go中的条件语句Switch示例详解
2021/08/23 Golang
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
宝塔更新Python及Flask项目的部署
2022/04/11 Python
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python