详解程序意外中断自动重启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中用于求最小值的min()方法
May 15 Python
在Python中操作列表之List.pop()方法的使用
May 21 Python
python非递归全排列实现方法
Apr 10 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
Python基础之高级变量类型实例详解
Jan 03 Python
TensorFlow tf.nn.max_pool实现池化操作方式
Jan 04 Python
python让函数不返回结果的方法
Jun 22 Python
AI:如何训练机器学习的模型
Apr 16 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_MySQL教程-第一天
2007/03/18 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
django 修改server端口号的方法
2018/05/14 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
python制作微博图片爬取工具
2021/01/16 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
大学四年个人自我小结
2014/03/05 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
专项法律服务方案
2014/06/11 职场文书
中文专业自荐书
2014/06/29 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
个人授权委托书范本
2014/09/14 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
python和anaconda的区别
2022/05/06 Python