如何为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:

基本测试完成!!!
浙公网安备 33010602011771号