详解程序意外中断自动重启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下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
20个常用Python运维库和模块
Feb 12 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
python实现键盘控制鼠标移动
Nov 27 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
python绘制漏斗图步骤详解
Mar 04 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
Puppeteer使用示例详解
Jun 20 Python
python中threading开启关闭线程操作
May 02 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 Python
Python 高级库15 个让新手爱不释手(推荐)
May 15 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
使用adodb lite解决问题
2006/12/31 PHP
php explode函数实例代码
2012/02/27 PHP
深入解析php之sphinx
2013/05/15 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
2016/02/16 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
详解react-redux插件入门
2018/04/19 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
vscode调试django项目的方法
2020/08/06 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
上课看小说检讨书
2014/02/22 职场文书
广告创意求职信
2014/03/17 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
红白喜事主持词
2015/07/06 职场文书
运动会1000米加油稿
2015/07/21 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS