如何为linux系统删除文件自动重启服务
使用环境:
python版本:python2.8
实现功能:
1.删除指定目录文件
2.检测指定路径下文件数量的多少,如果超过设置阈值,就会进行删除
3.删除文件后程序还可以重启指定的服务
代码开始:
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import os import re import time def batch_del_files(path_name, suffix, time_s): """ 这是一个删除特定后缀文件的func; :param time_s: :param path_name: 绝对路径名字; :param suffix: 删除文件的后缀名; :param time_s: 需要删除多少秒之前的生成的文件; :return: 返回0表示文件不需要清理,返回1表示文件清理完成; """ time_now = time.time() suffix_hint = 0 day_hint = 0 for f in os.listdir(path_name): if f.endswith(suffix): suffix_hint += 1 path_file = os.path.join(path_name, f) if os.stat(path_file).st_ctime < time_now - time_s: os.remove(path_file) day_hint += 1 if suffix_hint == 0: print '\033[0;31m注意:没有后缀为%s的文件...\033[0m' % suffix else: if day_hint == 0: print '\033[0;31m注意:路径为"%s"的文件夹,没有大于%s秒的文件...\033[0m' % (path_name, time_s) return 0 else: print ''' 删除文件完成!!! 共计删除%s个,后缀为%s的文件... ''' % (day_hint, suffix) return 1 def detection_procedure(ps_shell): """ 这是一个执行ps命令后的,将回显内容追加到list中的func; 然后进行返回; :param ps_shell: 它是一个需要执行ps命令的字符串; :return: 返回一个回显内容list; """ ps_list = [] ps_procedure = os.popen(ps_shell).read() # 获取到“ps”执行后的回显 row_str = '' # 定义一个行的字符串,它会将每一行的字符串追加到list中 for i in ps_procedure: if i != '\n': row_str += i else: ps_list.append(row_str) row_str = '' return ps_list def extraction_pid(ps_list, ps_program_name): """ 这是一个提取进程PID的函数,它是与“detection_procedure”func函数连用的; 这里需要为local func传入经过“detection_procedure”函数处理的列表; 最终将正确进程的PID取出进行返回; :param ps_program_name: 它是一个程序提取程序的名字; :param ps_list: 它是一个经过“detection_procedure”函数处理返回的list; :return: 返回程序正确的PID; """ # 匹配grep... match_value = re.search('grep.+', 'ps -ef |grep %s' % ps_program_name).group() for i in ps_list: # result结果会返回None(返回None表示没有匹配到)或其他 result = re.search('%s|%s' % ('ps -ef |grep %s' % ps_program_name, match_value), i) if result is not None: ps_list.remove(i) confirm_row = ps_list[0] # 取出正确的进程信息; confirm_pid = re.search('\d+', confirm_row).group() # 取出进程的PID; return confirm_pid def check_file(path, suffix, number, program_name, restart_wait_time, expire_file_time_s): """ 这是一个检测指定路径下的文件数量是否超过设定的数量; 如果超过设定的文件数量就会进行文件的删除并进行服务的重启; :param path: 指定路径; :param suffix: 指定删除文件的后缀; :param number: 设置文件数量阈值; :param program_name: 指定kill的进程名; :param restart_wait_time: 指定重启等待时间; :param expire_file_time_s: 指定删除给出后缀文件的超期时间,单位‘s’; :return: """ practical_number = len(os.listdir(path)) # 判断指定文件夹中文件的数量 if practical_number > number: print '\033[0;31m"%s"路径下存在:%s个以%s结尾的文件,可能存在堆积!\033[0m' % (path, practical_number, suffix) input_str = raw_input(''' 是否开始清理堆积?yes-no >>:''') if input_str == 'yes': result = batch_del_files(path_name=path, suffix=suffix, time_s=expire_file_time_s) if result == 0: exit(0) else: raw_input('回车继续...') ps_list_1 = detection_procedure(ps_shell='ps -ef |grep %s' % program_name) source_number = len(ps_list_1) # 用这个值来比较重启后的服务,如果相等就代表程序重启成功; if source_number == 3: list_1_pid = extraction_pid(ps_list=ps_list_1, ps_program_name=program_name) os.system('kill %s' % list_1_pid) print '进程"%s"已kill...' % program_name time.sleep(1) # 因为有一些进程是自动启动的,所以需要等待1秒再进行判断; print '已开始重新启动"%s"进程...耐心等待几秒!' % program_name count = 1 while True: # 这是循环检测程序是否启动成功代码; time.sleep(2) ps_list_2 = detection_procedure(ps_shell='ps -ef |grep %s' % program_name) if len(ps_list_2) != 3: wait_time = count * 2 print '已等待%s秒...' % wait_time if wait_time == restart_wait_time: print '\033[0;31m"%s"进程重启失败...请手动重启!\033[0m' % program_name break elif wait_time > restart_wait_time: print '\033[0;31m"%s"进程重启失败...请手动重启!\033[0m' % program_name break else: count += 1 else: list_2_pid = extraction_pid(ps_list=ps_list_2, ps_program_name=program_name) if list_2_pid != list_1_pid: print '"%s"进程启动成功...' % program_name break elif source_number < 3: print '\033[0;31m"%s"服务未运行...\033[0m' % program_name else: print '\033[0;31m请检查代码,程序名输入不够精确...\033[0m' else: print '巡检堆积程序已退出...' else: print'''文件堆积巡检成功! "%s"路径下的文件传输正常...''' % path if __name__ == '__main__': check_file(path='/root/test', suffix='txt', number=1, program_name='./nginx', restart_wait_time=20, expire_file_time_s=20)
代码结束...
使用场景:自己脑补...
测试回显截图:
测试1:
测试2:
测试3:
测试4:
基本测试完成!!!