ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何为inux系统删除文件自动重启服务

2022-05-09 10:00:58  阅读:149  来源: 互联网

标签:ps inux name 删除 ... 重启 list program time


使用环境:

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:

  

 

 基本测试完成!!!

标签:ps,inux,name,删除,...,重启,list,program,time
来源: https://www.cnblogs.com/noobXF/p/16248079.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有