Pour diverses raisons, je vais l'envoyer à mes collègues qui sont obligés de mesurer les performances avec la commande TOP de Linux.
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:
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)
À 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.
-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"
Je vais procéder dans cet ordre.
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
.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
.
.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
.
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)
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.
.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.
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