![Ausführen und Protokoll speichern](https://rvso.com/image/913182/Ausf%C3%BChren%20und%20Protokoll%20speichern.png)
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 for
auch cat
„und“ verwenden, while
und read
zwar 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>&1
wird hinzugefügt, falls Sie möchten, dass die Fehlermeldungen in Ihrer Protokolldatei enthalten sind. Weitere Informationen zur Konstruktion IFS= read -r line
finden Sie hierenzyklopädische Antwortbereitgestellt von @StéphaneChazelas.
Wenn die Ausführung wirklich lange dauert, können Sie sich außerdem ./script.pl
von 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.