[PYTHON] Extraire le résultat de la commande TOP avec USER et le sortir au format CSV

introduction

Pour diverses raisons, je vais l'envoyer à mes collègues qui sont obligés de mesurer les performances avec la commande TOP de Linux.

Objectif

Un fichier qui génère la commande Linux TOP en mode batch, Formatez-le dans un fichier csv en utilisant python3.

top.csv (exemple de sortie)


timestamp,PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND
10:00:00,1000,root,20,0,160000,2000,1640,R,10.0,0.2,0:00.02,top
10:00:00,3400,httpd,20,0,150000,2000,1700,S,0.0,0.3,0:07.98,nginx:

Quoi préparer

Préparez la sortie du fichier en mode TOP batch

Fichier de commandes TOP


top -b -d 20 -c > top_org.log

top_org.log


top - 10:00:00 up 1 days, 44 min,  2 users,  load average: 0.00, 0.01, 0.01
Tasks: 100 total,   1 running, 99 sleeping,   0 stopped,   1 zombie
%Cpu(s):  2.0 us,  4.0 sy,  0.0 ni, 80.0 id,  5.0 wa,  0.0 hi,  2.0 si,  0.0 st
KiB Mem :  1000000 total,    60000 free,   700000 used,   200000 buff/cache
KiB Swap:  2000000 total,    90000 free,  2000000 used.    70000 avail Mem 

PID   USER     PR   NI VIRT     RES    SHR  S  %CPU %MEM  TIME+    COMMAND
1000 root      20   0  160000   2000   1640 R  10.0  0.2   0:00.02 top -b -d 20 -c
4500 apache    20   0  440000   1000      8 S   0.0  0.1   0:00.01 /usr/sbin/httpd
17000 mysql     20   0 1130000   7000      0 S   0.0  0.7  20:00.00 /usr/sbin/mysqld
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [kthreadd]
    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0H]
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [ksoftirqd/0]
・ ・ ・ (Omis ci-dessous)

Pour ceux qui sont pressés

À la fin de cet article, il y a un code source non divisé. Veuillez vous y référer. À ce moment, veuillez ne changer que les pièces suivantes.

La partie qui change à chaque fois

-UTILISATEUR à extraire -Emplacement du "fichier de commandes TOP" -Emplacement du "fichier CSV avec fichier de commande TOP formaté" Est défini dans la partie suivante. Veuillez le modifier en fonction des conditions et de l'environnement souhaités.

.py


'''
Informations de réglage
'''
#UTILISATEUR pour extraire (si non défini, tous les utilisateurs seront extraits.,Défini par délimiteur)
user_array =['root'] 

#Obtenir le Dir actuel
current_dir = os.getcwd()
#nom du fichier d'entrée(Full PATH)
input_file_name=f"{current_dir}\\before\\top_org.log"
#nom du fichier de sortie(Full PATH)
output_file_name=f"{current_dir}\\after\\top_csv.csv"

Code source

Commentaire

  1. Définition des informations requises
  2. Lire le fichier de commandes TOP
  3. Extrayez l'horodatage utilisé pour la première colonne
  4. Extrayez le processus de l'UTILISATEUR cible
  5. Sortie de fichier CSV

Je vais procéder dans cet ordre.

1. Définition des informations requises

Spécifiez l'UTILISATEUR à extraire et l'emplacement où se trouve le fichier de commandes TOP.

.py


# -*- coding: utf-8 
import re
import os
import csv

'''
Informations de réglage
'''
#UTILISATEUR pour extraire (si non défini, tous les utilisateurs seront extraits.,Défini par délimiteur)
user_array =['root'] 

#Obtenir le Dir actuel
current_dir = os.getcwd()
#nom du fichier d'entrée(Full PATH)
input_file_name=f"{current_dir}\\before\\top.log"
#nom du fichier de sortie(Full PATH)
output_file_name=f"{current_dir}\\after\\top.log"

#Quel est le début de la ligne de processus dans le résultat d'une commande TOP?
process_row_start = 8
#Quelle est la position de la colonne USER dans le résultat de la commande TOP?
user_column = 2
#Quelle est la position de la colonne COMMAND dans le résultat de la commande TOP?
command_column = 12

2. Lire le fichier de commandes TOP

.py


    #Lecture du fichier d'entrée
    f = open(f"{input_file_name}", "r")
    toplog_lines = f.readlines()
    f.close()

Lisez le fichier d'entrée (fichier de commande TOP) ligne par ligne et stockez-le dans la variable toplog_lines.

3. Extrayez l'horodatage utilisé pour la première colonne

.py


    #expression régulière d'horodatage
    r_top_timestamp = re.compile("top - ([0-9:]+)+")

    timestamp_list = []
    roop_cnt = 0
    for toplog_line in toplog_lines :
        #Si l'horodatage correspond à l'expression régulière, placez le numéro de ligne du fichier de commande TOP dans le tableau.
        if r_top_timestamp.search(toplog_line) != None:
            timestamp_list.append(roop_cnt)
        roop_cnt += 1

Ici, l'horodatage (top --10: 00: 00 jusqu'à 1 jours, 44 min, 2 utilisateurs, moyenne de charge: 0,00, 0,01, 0,01) est Vérifiez le numéro de ligne du fichier de commande TOP et stockez le numéro de ligne dans timestamp_list.

4. Extrayez le processus de l'UTILISATEUR cible

Tout d'abord, définissez les variables requises dans la boucle d'extraction de processus.

.py


#Position du début de la ligne de process avec la commande TOP
process_row_start = 8
#Position de la colonne USER dans la ligne de processus avec la commande TOP
user_column = 2
#Position de la colonne COMMAND dans la ligne de processus avec la commande TOP
command_column = 12
#Variable pour compter le nombre de lignes de commande TOP à la fois
rows_count = 0
#Variable pour stocker l'horodatage
tmp_timestamp = ''
#Array (tmp) pour stocker la chaîne de caractères à envoyer vers csv
tmp_output_csv_list = []
#Tableau pour stocker la chaîne de caractères à envoyer vers csv (utilisé pour l'écriture réelle)
output_csv_list = []

Ensuite, bouclez le fichier de commande TOP ligne par ligne. Nous mettons en œuvre ce qui suit. ・ Extraire l'heure d'exécution de la commande TOP (horodatage) -Vérifiez le processus colonne par colonne, et s'il s'agit de la cible d'extraction USER, cible de sortie csv

.py


    for toplog_line in toplog_lines :
        #Comptez le nombre de lignes TOP à la fois+1
        rows_count +=1
        #Supprimer les sauts de ligne à la fin des lignes
        toplog_line = toplog_line.rstrip()

        #Si seulement des sauts de ligne, passez à la ligne suivante
        if not toplog_line :
            continue

        #Pour une ligne d'horodatage, ajoutez-la à la liste et passez à la ligne suivante
        if r_top_timestamp.search(toplog_line) != None:
            print(toplog_line)
            tmp_timestamp = r_top_timestamp.search(toplog_line).group(1)
            #Un résultat de commande TOP, initialisation du nombre de lignes
            rows_count = 1
            continue

        #Pour les lignes de processus, extraire si l'utilisateur correspond
        if rows_count >= process_row_start:
            column_number = 0
            row_data = toplog_line.split(" ")
            #Définir l'horodatage
            tmp_output_csv_list = [tmp_timestamp]

            #Répéter jusqu'à la fin de la ligne
            for column_data in row_data:
                if column_data =="":
                    #Si vide, passez à la colonne suivante
                    continue
                column_number += 1

                #Mettez les données dans la colonne COMMAND dans la liste tmp
                if column_number <= command_column :
                    tmp_output_csv_list.append(column_data)
                else :
                    continue

                #Vérifiez s'il s'agit d'un enregistrement à extraire
                #Utilisateur cible d'extraction ou utilisateur_Lorsque le tableau n'est pas spécifié Sélectionnez l'enregistrement à extraire
                if column_number == user_column :
                    user_key_flg = True
                    for key_user in user_array:
                        #Utilisateur cible d'extraction ou utilisateur_Enregistrement à extraire lorsque le tableau n'est pas spécifié
                        if ( str(column_data) == key_user ):
                            user_key_flg = True
                            break
                        else:
                            user_key_flg = False

                    if user_key_flg == True :
                        pass
                    else:
                        break
            # for-else: ajouter à la liste d'extraction CSV uniquement lorsque les conditions sont remplies
            else:
                output_csv_list.append(tmp_output_csv_list)

5. Sortie de fichier CSV

Renvoie le contenu de la liste d'extraction csv ʻoutput_csv_list` vers csv.

.py


    #Exportation CSV
    csv_header = ['timestamp','USER','PR','NI','VIRT','RES','SHR','%CPU','%MEM','TIME+','COMMAND']
    with open(f'{output_file_name}','w') as f:
        csv_writer = csv.writer( f, delimiter = ',', lineterminator = '\n') 
        csv_writer.writerow(csv_header)
        csv_writer.writerows(output_csv_list)   

csv_writer = csv.writer (f, delimiter = ',', lineterminator = '\ n'), délimiteur = ',', Si vous définissez delimiter = '\ t', ce sera également un fichier tsv (fichier délimité par des tabulations). comme vous voulez.

Résumé du code source

.py


'''
Extrayez la ligne de processus de la commande Top avec USER et exportez-la dans le fichier csv
timestamp,USER,PR,NI,VIRT,RES,SHR,%CPU,%MEM,TIME+,COMMAND
'''

# -*- coding: utf-8 
import re
import os
import csv

'''
Informations de réglage
'''
#UTILISATEUR pour extraire (si non défini, tous les utilisateurs seront extraits.,Défini par délimiteur)
user_array =['apache','httpd']

#Obtenir le Dir actuel
current_dir = os.getcwd()
#nom du fichier d'entrée(Full PATH)
input_file_name=f"{current_dir}\\before\\top.log"
#nom du fichier de sortie(Full PATH)
output_file_name=f"{current_dir}\\after\\top.log"


#Position du début de la ligne de process avec la commande TOP
process_row_start = 8
#Position de la colonne USER dans la ligne de processus avec la commande TOP
user_column = 2
#Position de la colonne COMMAND dans la ligne de processus avec la commande TOP
command_column = 12

#expression régulière d'horodatage
r_top_timestamp = re.compile("top - ([0-9:]+)+")

########traitement principal#############
if __name__ == '__main__' :
    '''----------------------
lire le fichier toplog
    ----------------------'''
    #Lecture du fichier d'entrée
    f = open(f"{input_file_name}", "r")
    toplog_lines = f.readlines()
    f.close()

    '''----------------------
Extraction de la ligne d'horodatage
    ----------------------'''
    timestamp_list = []
    roop_cnt = 0
    for toplog_line in toplog_lines :
        #Mettez le numéro de ligne dans le tableau si l'horodatage correspond à l'expression régulière
        if r_top_timestamp.search(toplog_line) != None:
            timestamp_list.append(roop_cnt)
        roop_cnt += 1

    '''--------------------------
Extraire le processus de l'utilisateur cible
    --------------------------'''
    rows_count = 0
    tmp_timestamp = ''
    tmp_output_csv_list = []
    output_csv_list = []

    for toplog_line in toplog_lines :
        #Comptez le nombre de lignes TOP à la fois+1
        rows_count +=1
        #Supprimer les sauts de ligne à la fin des lignes
        toplog_line = toplog_line.rstrip()

        #Si seulement des sauts de ligne, passez à la ligne suivante
        if not toplog_line :
            continue

        #Pour les lignes d'horodatage, ajoutez à la liste
        if r_top_timestamp.search(toplog_line) != None:
            print(toplog_line)
            tmp_timestamp = r_top_timestamp.search(toplog_line).group(1)
            #Un résultat de commande TOP, initialisation du nombre de lignes
            rows_count = 1
            continue

        #Pour les lignes de processus, extraire si l'utilisateur correspond
        if rows_count >= process_row_start:
            column_number = 0
            row_data = toplog_line.split(" ")
            #Définir l'horodatage
            tmp_output_csv_list = [tmp_timestamp]

            #Répéter jusqu'à la fin de la ligne
            for column_data in row_data:
                if column_data =="":
                    #Si vide, passez à la colonne suivante
                    continue
                column_number += 1

                #Mettez les données dans la colonne COMMAND dans la liste tmp
                if column_number <= command_column :
                    tmp_output_csv_list.append(column_data)
                else :
                    continue

                #Vérifiez s'il s'agit d'un enregistrement à extraire
                #Utilisateur cible d'extraction ou utilisateur_Enregistrement à extraire lorsque le tableau n'est pas spécifié
                if column_number == user_column :
                    user_key_flg = True
                    for key_user in user_array:
                        #Utilisateur cible d'extraction ou utilisateur_Enregistrement à extraire lorsque le tableau n'est pas spécifié
                        if ( str(column_data) == key_user ):
                            user_key_flg = True
                            break
                        else:
                            user_key_flg = False

                    if user_key_flg == True :
                        pass
                    else:
                        break
            #Si l'instruction for est quittée par autre chose que break, ajoutez-la à la liste d'extraction CSV.
            else:
                output_csv_list.append(tmp_output_csv_list)


    '''--------------------------
Écriture de fichier
    --------------------------'''
    #Exportation CSV
    csv_header = ['timestamp','USER','PR','NI','VIRT','RES','SHR','%CPU','%MEM','TIME+','COMMAND']
    with open(f'{output_file_name}','w') as f:
        csv_writer = csv.writer( f, delimiter = ',', lineterminator = '\n') 
        csv_writer.writerow(csv_header)
        csv_writer.writerows(output_csv_list)

c'est tout.

Impressions

J'espère qu'il n'y aura pas d'outils et que seuls les résultats de la commande TOP seront passés, ce qui réduira le fardeau de ceux qui sont censés «collecter».

Recommended Posts

Extraire le résultat de la commande TOP avec USER et le sortir au format CSV
Extraire le jeu de données bigquery et la liste des tables avec python et la sortie en CSV
Lire JSON avec Python et générer un CSV
Afficher le résultat de sortie de sklearn.metrics.classification_report sous forme de fichier CSV
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Frappez la commande supérieure avec htop
Récupérer le csv publié avec Github Action et le publier sur les pages Github
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
Exportez le rapport au format PDF à partir de DB avec Python et attachez-le automatiquement à un e-mail et envoyez-le
Gratter l'holojour et l'afficher dans la CLI
Lisez le fichier csv et affichez-le dans le navigateur
Extraire des fichiers du stockage EC2 avec la commande scp
Lire le fichier json avec Python, le formater et générer le json
Exécuter une commande sur le serveur Web et afficher le résultat
POSTER l'image avec json et la recevoir avec flask
Extraire la valeur maximale avec les pandas et modifier cette valeur
À la suite du montage et du réglage avec POH! Lite
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
En Python, les éléments de la liste sont triés et sortis sous forme d'éléments et de multiples.
Vérifiez l'état de fonctionnement du serveur avec la commande Linux top
Sortie du résultat de la méthode de descente de dégradé sous forme d'animation matplotlib
[Python] Qu'est-ce que pip? Expliquez la liste des commandes et comment l'utiliser avec des exemples réels
[Python] Comment récupérer un fichier html local et le générer au format CSV à l'aide de Beautiful Soup
Extraire les données Twitter avec CSV
Extraire les données csv et calculer
Accordez un jeton d'accès avec la commande curl et POST l'API
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Convertissez le résultat de python optparse en dict et utilisez-le
Extraire des tables de base de données avec CSV [connexion ODBC de R et python]
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)