详解程序意外中断自动重启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 相关文章推荐
Python2.x版本中cmp()方法的使用教程
May 14 Python
python实现获取Ip归属地等信息
Aug 27 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
flask 实现token机制的示例代码
Nov 07 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
在Python中通过threshold创建mask方式
Feb 19 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
python 一维二维插值实例
Apr 22 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
什么是python的函数体
Jun 19 Python
Python绘制组合图的示例
Sep 18 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
8个必备的PHP功能实例代码
2013/10/27 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
JS继承--原型链继承和类式继承
2013/04/08 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
用js传递value默认值的示例代码
2014/09/11 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
JS获取时间的相关函数及时间戳与时间日期之间的转换
2016/02/04 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
python自动化测试之连接几组测试包实例
2014/09/28 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
全球在线商店:BerryLook
2019/04/14 全球购物
食堂个人先进事迹
2014/01/22 职场文书
怎么写好自荐书
2014/03/02 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers