Aus verschiedenen Gründen werde ich es an meine Kollegen senden, die gezwungen sind, die Leistung mit dem TOP-Befehl von Linux zu messen.
Eine Datei, die den Linux TOP-Befehl im Batch-Modus ausgibt. Formatieren Sie es mit Python3 in eine CSV-Datei.
top.csv (Ausgabebeispiel)
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:
Bereiten Sie die Dateiausgabe im TOP-Batch-Modus vor
TOP-Befehlsdatei
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]
・ ・ ・ (Unten weggelassen)
Am Ende dieses Artikels befindet sich nicht geteilter Quellcode. Bitte beziehen Sie sich darauf. Bitte ändern Sie zu diesem Zeitpunkt nur die folgenden Teile.
-USER extrahiert werden -Lageort der "TOP-Befehlsdatei" -Lageort von "CSV-Datei mit formatierter TOP-Befehlsdatei" Wird im folgenden Teil eingestellt. Bitte ändern Sie es entsprechend Ihren gewünschten Bedingungen und Umgebung.
.py
'''
Informationen einstellen
'''
#Zu extrahierender BENUTZER (Wenn nicht festgelegt, werden alle BENUTZER extrahiert.,Durch Trennzeichen festgelegt)
user_array =['root']
#Holen Sie sich aktuelle Dir
current_dir = os.getcwd()
#Name der Eingabedatei(Full PATH)
input_file_name=f"{current_dir}\\before\\top_org.log"
#Name der Ausgabedatei(Full PATH)
output_file_name=f"{current_dir}\\after\\top_csv.csv"
Ich werde in dieser Reihenfolge fortfahren.
Geben Sie den zu extrahierenden USER und den Speicherort an, an dem sich die TOP-Befehlsdatei befindet.
.py
# -*- coding: utf-8
import re
import os
import csv
'''
Informationen einstellen
'''
#Zu extrahierender BENUTZER (Wenn nicht festgelegt, werden alle BENUTZER extrahiert.,Durch Trennzeichen festgelegt)
user_array =['root']
#Holen Sie sich aktuelle Dir
current_dir = os.getcwd()
#Name der Eingabedatei(Full PATH)
input_file_name=f"{current_dir}\\before\\top.log"
#Name der Ausgabedatei(Full PATH)
output_file_name=f"{current_dir}\\after\\top.log"
#Was ist der Anfang der Prozesszeile im Ergebnis eines TOP-Befehls?
process_row_start = 8
#Welche Spalte hat die Position der USER-Spalte im TOP-Befehlsergebnis?
user_column = 2
#Wie ist die Position der Spalte COMMAND im Ergebnis des TOP-Befehls?
command_column = 12
.py
#Eingabedatei gelesen
f = open(f"{input_file_name}", "r")
toplog_lines = f.readlines()
f.close()
Lesen Sie die Eingabedatei (TOP-Befehlsdatei) zeilenweise und speichern Sie sie in der Variablen toplog_lines
.
.py
#regulärer Ausdruck des Zeitstempels
r_top_timestamp = re.compile("top - ([0-9:]+)+")
timestamp_list = []
roop_cnt = 0
for toplog_line in toplog_lines :
#Wenn der Zeitstempel mit dem regulären Ausdruck übereinstimmt, fügen Sie die Zeilennummer der TOP-Befehlsdatei in das Array ein.
if r_top_timestamp.search(toplog_line) != None:
timestamp_list.append(roop_cnt)
roop_cnt += 1
Hier ist der Zeitstempel (top --10: 00: 00 bis 1 Tag, 44 min, 2 Benutzer, Lastdurchschnitt: 0,00, 0,01, 0,01
)
Überprüfen Sie die Zeilennummer der TOP-Befehlsdatei und speichern Sie die Zeilennummer in timestamp_list
.
Definieren Sie zunächst die erforderlichen Variablen in der Prozessextraktionsschleife.
.py
#Position des Starts der Prozesszeile mit dem Befehl TOP
process_row_start = 8
#Position der USER-Spalte in der Prozesszeile mit dem Befehl TOP
user_column = 2
#Position der COMMAND-Spalte in der Prozesszeile mit dem Befehl TOP
command_column = 12
#Variable zum gleichzeitigen Zählen der Anzahl der TOP-Befehlszeilen
rows_count = 0
#Variable zum Speichern des Zeitstempels
tmp_timestamp = ''
#Array (tmp) zum Speichern der Zeichenfolge, die an csv ausgegeben werden soll
tmp_output_csv_list = []
#Array zum Speichern der Zeichenfolge, die an csv ausgegeben werden soll (wird zum eigentlichen Schreiben verwendet)
output_csv_list = []
Führen Sie als Nächstes die TOP-Befehlsdatei zeilenweise durch. Wir implementieren Folgendes. ・ Extrahieren Sie die Ausführungszeit des TOP-Befehls (Zeitstempel). -Überprüfen Sie den Prozess spaltenweise, und wenn es sich um das Extraktionsziel USER handelt, geben Sie das CSV-Ausgabeziel ein
.py
for toplog_line in toplog_lines :
#Zählen Sie die Anzahl der TOP-Zeilen gleichzeitig+1
rows_count +=1
#Zeilenumbrüche am Zeilenende entfernen
toplog_line = toplog_line.rstrip()
#Wenn nur Zeilenumbrüche vorliegen, fahren Sie mit der nächsten Zeile fort
if not toplog_line :
continue
#Fügen Sie eine Zeitstempelzeile zur Liste hinzu und fahren Sie mit der nächsten Zeile fort
if r_top_timestamp.search(toplog_line) != None:
print(toplog_line)
tmp_timestamp = r_top_timestamp.search(toplog_line).group(1)
#Ein TOP-Befehlsergebnis, Initialisierung der Zeilenanzahl
rows_count = 1
continue
#Extrahieren Sie für Prozesszeilen, wenn der Benutzer übereinstimmt
if rows_count >= process_row_start:
column_number = 0
row_data = toplog_line.split(" ")
#Zeitstempel einstellen
tmp_output_csv_list = [tmp_timestamp]
#Wiederholen Sie bis zum Ende der Zeile
for column_data in row_data:
if column_data =="":
#Wenn leer, fahren Sie mit der nächsten Spalte fort
continue
column_number += 1
#Fügen Sie die Daten in die Spalte BEFEHL in der tmp-Liste ein
if column_number <= command_column :
tmp_output_csv_list.append(column_data)
else :
continue
#Überprüfen Sie, ob es sich um einen zu extrahierenden Datensatz handelt
#Extraktionsziel BENUTZER oder Benutzer_Wenn kein Array angegeben ist Wählen Sie den zu extrahierenden Datensatz aus
if column_number == user_column :
user_key_flg = True
for key_user in user_array:
#Extraktionsziel BENUTZER oder Benutzer_Datensatz, der extrahiert werden soll, wenn kein Array angegeben ist
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-sonst: Nur dann zur CSV-Extraktionsliste hinzufügen, wenn die Bedingungen erfüllt sind
else:
output_csv_list.append(tmp_output_csv_list)
csv Gibt den Inhalt der Extraktionsliste output_csv_list
an csv aus.
.py
#CSV-Export
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')
,
delimiter = ','
,
Wenn Sie delimiter = '\ t'
setzen, handelt es sich auch um eine tsv-Datei (tabulatorgetrennte Datei).
wie es Dir gefällt.
.py
'''
Extrahieren Sie die Prozesszeile des Befehls Top mit USER und geben Sie sie in die CSV-Datei aus
timestamp,USER,PR,NI,VIRT,RES,SHR,%CPU,%MEM,TIME+,COMMAND
'''
# -*- coding: utf-8
import re
import os
import csv
'''
Informationen einstellen
'''
#Zu extrahierender BENUTZER (Wenn nicht festgelegt, werden alle BENUTZER extrahiert.,Durch Trennzeichen festgelegt)
user_array =['apache','httpd']
#Holen Sie sich aktuelle Dir
current_dir = os.getcwd()
#Name der Eingabedatei(Full PATH)
input_file_name=f"{current_dir}\\before\\top.log"
#Name der Ausgabedatei(Full PATH)
output_file_name=f"{current_dir}\\after\\top.log"
#Position des Starts der Prozesszeile mit dem Befehl TOP
process_row_start = 8
#Position der USER-Spalte in der Prozesszeile mit dem Befehl TOP
user_column = 2
#Position der COMMAND-Spalte in der Prozesszeile mit dem Befehl TOP
command_column = 12
#regulärer Ausdruck des Zeitstempels
r_top_timestamp = re.compile("top - ([0-9:]+)+")
########Hauptverarbeitung#############
if __name__ == '__main__' :
'''----------------------
toplog-Datei lesen
----------------------'''
#Eingabedatei gelesen
f = open(f"{input_file_name}", "r")
toplog_lines = f.readlines()
f.close()
'''----------------------
Extraktion der Zeitstempellinie
----------------------'''
timestamp_list = []
roop_cnt = 0
for toplog_line in toplog_lines :
#Fügen Sie die Zeilennummer in das Array ein, wenn der Zeitstempel mit dem regulären Ausdruck übereinstimmt
if r_top_timestamp.search(toplog_line) != None:
timestamp_list.append(roop_cnt)
roop_cnt += 1
'''--------------------------
Extrahieren Sie den Prozess des Zielbenutzers
--------------------------'''
rows_count = 0
tmp_timestamp = ''
tmp_output_csv_list = []
output_csv_list = []
for toplog_line in toplog_lines :
#Zählen Sie die Anzahl der TOP-Zeilen gleichzeitig+1
rows_count +=1
#Zeilenumbrüche am Zeilenende entfernen
toplog_line = toplog_line.rstrip()
#Wenn nur Zeilenumbrüche vorliegen, fahren Sie mit der nächsten Zeile fort
if not toplog_line :
continue
#Für Zeitstempellinien zur Liste hinzufügen
if r_top_timestamp.search(toplog_line) != None:
print(toplog_line)
tmp_timestamp = r_top_timestamp.search(toplog_line).group(1)
#Ein TOP-Befehlsergebnis, Initialisierung der Zeilenanzahl
rows_count = 1
continue
#Extrahieren Sie für Prozesszeilen, wenn der Benutzer übereinstimmt
if rows_count >= process_row_start:
column_number = 0
row_data = toplog_line.split(" ")
#Zeitstempel einstellen
tmp_output_csv_list = [tmp_timestamp]
#Wiederholen Sie bis zum Ende der Zeile
for column_data in row_data:
if column_data =="":
#Wenn leer, fahren Sie mit der nächsten Spalte fort
continue
column_number += 1
#Fügen Sie die Daten in die Spalte BEFEHL in der tmp-Liste ein
if column_number <= command_column :
tmp_output_csv_list.append(column_data)
else :
continue
#Überprüfen Sie, ob es sich um einen zu extrahierenden Datensatz handelt
#Extraktionsziel BENUTZER oder Benutzer_Datensatz, der extrahiert werden soll, wenn kein Array angegeben ist
if column_number == user_column :
user_key_flg = True
for key_user in user_array:
#Extraktionsziel BENUTZER oder Benutzer_Datensatz, der extrahiert werden soll, wenn kein Array angegeben ist
if ( str(column_data) == key_user ):
user_key_flg = True
break
else:
user_key_flg = False
if user_key_flg == True :
pass
else:
break
#Wenn die for-Anweisung durch etwas anderes als break beendet wird, fügen Sie sie der CSV-Extraktionsliste hinzu.
else:
output_csv_list.append(tmp_output_csv_list)
'''--------------------------
Datei schreiben
--------------------------'''
#CSV-Export
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)
das ist alles.
Ich hoffe, dass es keine Tools gibt und nur die TOP-Befehlsergebnisse übergeben werden, was die Belastung für diejenigen verringert, die angeblich "sammeln".