详解程序意外中断自动重启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 Socket编程入门教程
Jul 11 Python
python中二维阵列的变换实例
Oct 09 Python
python内存管理分析
Apr 08 Python
Python的Flask框架中实现简单的登录功能的教程
Apr 20 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
python写入文件自动换行问题的方法
Jul 05 Python
django admin组件使用方法详解
Jul 19 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 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
如何给phpadmin一个保护
2006/10/09 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
详解jQuery中的事件
2016/12/14 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[20:30]职业巡回赛回顾
2018/08/09 DOTA
python的re模块应用实例
2014/09/26 Python
详解Django框架中的视图级缓存
2015/07/23 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
商场中秋节活动方案
2014/02/07 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
场地使用证明模板
2014/10/25 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
2015年复活节活动总结
2015/02/27 职场文书
关于迟到的检讨书
2015/05/06 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
千与千寻观后感
2015/06/04 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
Python装饰器的练习题
2021/11/23 Python