详解程序意外中断自动重启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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
为Python的web框架编写MVC配置来使其运行的教程
Apr 30 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
用python生成1000个txt文件的方法
Oct 25 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
python3转换code128条形码的方法
Apr 17 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
python 实现字符串下标的输出功能
Feb 13 Python
Python快速优雅的批量修改Word文档样式
May 20 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
德生PL550的电路分析
2021/03/02 无线电
php flv视频时间获取函数
2010/06/29 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
浅析PHP文件下载原理
2014/12/25 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
简单谈谈php延迟静态绑定
2016/01/26 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
利用python实现逐步回归
2020/02/24 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
校园之声广播稿
2014/01/31 职场文书
小学教师节活动总结
2015/03/20 职场文书
匿名信格式范文
2015/05/27 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android