详解程序意外中断自动重启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切换hosts文件代码示例
Dec 31 Python
python连接mysql实例分享
Oct 09 Python
Python实现PS滤镜中马赛克效果示例
Jan 20 Python
使用Python进行目录的对比方法
Nov 01 Python
Python构建图像分类识别器的方法
Jan 12 Python
详解Python 切片语法
Jun 10 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
python json.dumps中文乱码问题解决
Apr 01 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
Python获取指定日期是"星期几"的6种方法
Mar 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使用静态方法的几个注意事项
2014/09/16 PHP
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
python操作MongoDB基础知识
2013/11/01 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
html5唤起app的方法
2017/11/30 HTML / CSS
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
学前教育求职自荐信范文
2013/12/25 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
初三学习计划书范文
2014/04/30 职场文书
平安校园建设方案
2014/05/02 职场文书
大学生找工作求职信
2014/07/09 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
科学发展观标语
2014/10/08 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书