详解程序意外中断自动重启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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
进一步了解Python中的XML 工具
Apr 13 Python
python多进程实现进程间通信实例
Nov 24 Python
[原创]教女朋友学Python(一)运行环境搭建
Nov 29 Python
Tornado 多进程实现分析详解
Jan 12 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
jenkins配置python脚本定时任务过程图解
Oct 29 Python
python next()和iter()函数原理解析
Feb 07 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
Feb 26 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 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扩展开发经验分享
2012/09/06 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
WordPress JQuery处理沙发头像
2009/06/22 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
js实现文字滚动效果
2016/03/03 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
php 修改密码实现代码
2017/05/24 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
python实现的希尔排序算法实例
2015/07/01 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
python K近邻算法的kd树实现
2018/09/06 Python
Python类的继承用法示例
2019/01/31 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
.NET常见笔试题集
2012/12/01 面试题
大学生物业管理求职信
2013/10/24 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
社区服务活动报告
2015/02/05 职场文书
指导教师推荐意见
2015/06/05 职场文书
运动会200米广播稿
2015/08/19 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
k8s部署redis cluster集群的实现
2021/06/24 Redis
python缺失值填充方法示例代码
2022/12/24 Python