详解程序意外中断自动重启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爬虫框架Scrapy安装使用步骤
Apr 01 Python
Python文件夹与文件的操作实现代码
Jul 13 Python
Ubuntu安装Jupyter Notebook教程
Oct 18 Python
python实时获取外部程序输出结果的方法
Jan 12 Python
Python 通过打码平台实现验证码的实现
May 13 Python
docker-py 用Python调用Docker接口的方法
Aug 30 Python
Python的缺点和劣势分析
Nov 19 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 Python
Python collections.deque双边队列原理详解
Oct 05 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留言本实例代码
2010/05/09 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
js left,right,mid函数
2008/06/10 Javascript
给Function做的OOP扩展
2009/05/07 Javascript
js jquery数组介绍
2012/07/15 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
Django实现celery定时任务过程解析
2020/04/21 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
python中uuid模块实例浅析
2020/12/29 Python
Python读写Excel表格的方法
2021/03/02 Python
Ajax和javascript的区别
2013/07/20 面试题
企业治理工作自我评价
2013/09/26 职场文书
《散步》教学反思
2014/03/02 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
三八妇女节标语
2014/10/09 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android