Ich muss meinen Bash-Batchjob (5,1 KB Dateien direkt komprimieren) so einrichten, dass, wenn ich den Job stoppen/fortsetzen muss, dieser wartet, bis er sich „zwischen“ Dateien befindet (gerade eine beendet und noch keine andere gestartet hat).
Meine Komprimierung würde so aussehen, pigz -9 -- rsnc*
wenn alles auf einmal ausgeführt würde, und ich dachte an so etwas wie:
ls rsnc* | while read file
do pigz -9 -- $file
if [ -f .intr ]
then break
fi
done
Ist das ein verlässliches Mittel, um mein Ziel zu erreichen? Gibt es einen besseren Weg?
Antwort1
Du kannst trap
[1],[2] das Ctrl+ CSignal, das INT Signal und wait
für die Beendigung jedes Prozesses.
#!/bin/bash
trap ctrl_c INT
function ctrl_c() {
wait # wait for the end of all child processes
exit # <<--- put here your exit code exit 1, ...
}
shopt -s nullglob
for f in rsnc*
do
pigz -9 -- $file & # Execute in background
wait $! # Wait for the end of the last command
done
Notiz
Es gibt viele Möglichkeiten, alle Dateien in einem Verzeichnis zu durchlaufen [3] , aber es ist immerbesser vermeiden, die Ausgabe zu analysieren vonls
[4] .
Verweise
- Abfangen von Strg-C in Bash, ein einfaches Beispiel.
- Fallenaus dem Bash-Handbuch für Anfänger – Kapitel 12.
- Bash-Schleife über Dateien.
- Einige Gründe, warum es besser ist,Vermeiden Sie die Analyse der LS-Ausgabe.