Ausführen und Protokoll speichern

Ausführen und Protokoll speichern

Ich führe das Skript für die Argumente über eine Schleife aus und speichere die Protokolle in einer Datei. Wie verwende ich den Args-Befehl, um alles auf einmal auszuführen? Unten habe ich args -n -500 ausprobiert.

Dadurch werden jedoch keine Protokolle gespeichert. Wie kann ich hier etwas anhängen, um Protokolle zu speichern?

Antwort1

Ich denke, du musst nurGruppedie Befehle der inneren Schleife und leiten ihre Ausgabe in eine Datei um, die mit demselben Index indiziert ist $i, und pushen dann alles zusammen im Hintergrund &. So etwas wie

for i in $(cat $file_name)
do
    (echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" &
done

Stattdessen würde ich in diesem Fall forauch cat„und“ verwenden, whileund readzwar in etwa so:

#!/bin/bash

file_name='in_file'

while IFS= read -r i
do
        (echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" 2>&1 &
done < "$file_name"

Hier 2>&1wird hinzugefügt, falls Sie möchten, dass die Fehlermeldungen in Ihrer Protokolldatei enthalten sind. Weitere Informationen zur Konstruktion IFS= read -r linefinden Sie hierenzyklopädische Antwortbereitgestellt von @StéphaneChazelas.

Wenn die Ausführung wirklich lange dauert, können Sie sich außerdem ./script.plvon der aktuellen Shell trennen, falls Sie versehentlich das Terminalfenster schließen, in dem das Hauptskript gestartet wurde. Zu diesem Zweck können Sie verwendennohup mycommand &stattdessen einfach nur &.


Dem obigen Szenario zufolge ist die wahrscheinlich einfachste Möglichkeit, alle Protokolle in einer Datei zusammenzuführen, die erneute Verwendung einer Schleife (sobald alle Jobs des Hauptskripts abgeschlossen sind), und zwar folgendermaßen:

#!/bin/bash

file_name='in_file'
merged_log='out_file'

>"$merged_log"   # empty the merged log file - not mandatory if the file doesn't exist

while IFS= read -r i
do
        cat "${file_save}-${i}" >> "$merged_log"
        rm "${file_save}-${i}"
done < "$file_name"

Das hier sollte auch funktionieren:

#!/bin/bash

file_name='in_file'
merged_log='out_file'

while IFS= read -r i
do
        cat "${file_save}-${i}"
        rm "${file_save}-${i}"
done < "$file_name" > "$merged_log"

Antwort2

Wenn die Schreibreihenfolge keine Rolle spielt,

for i in $(cat $file_name);do echo $i; ./script.pl $i>>file & done

Dies ist parallel.

verwandte Informationen