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

 基本测试完成!!!