详解程序意外中断自动重启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编写vim插件的简单示例
Apr 17 Python
Python中的一些陷阱与技巧小结
Jul 10 Python
Python如何为图片添加水印
Nov 25 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
Windows下python3.6.4安装教程
Jul 31 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
python else语句在循环中的运用详解
Jul 06 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 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数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
PHP多线程类及用法实例
2014/12/03 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
python实现串口自动触发工作的示例
2019/07/02 Python
Django多数据库的实现过程详解
2019/08/01 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
销售团队激励口号
2014/06/06 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
企业安全生产规章制度
2015/08/06 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
委托书范本格式
2019/04/18 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL