Meillo hat geschrieben: 05.05.2022 21:17:28
Ganz einfach: Indem du nach dem Befehl ein &-Zeichen machst. Dann laeuft der Job im HIntergrund und sofort wird der naechste Job im Hintergrund gestartet, usw. Mehrere laufende Jobs werden dann automatisch auf mehrere Kerne verteilt.
So werden mehr Prozesse gestartet, als Kerne verfügbar sind.
Aber ich denke ich habe eine bessere Lösung gefunden:
Code: Alles auswählen
for mach in 3 5 1 3 ; do sem -j 3 "sleep $mach && echo $mach" ; done; sem --wait
sem -j N garantiert mir, dass nur N Kerne benutzt werden.
sleep müsste dann natürlich mit clamscan entsprechend ersetzt werden.
Aber es gibt bei der Sache noch ein anderes Problem. Die Ausgabe in der Konsole könnte sich überschneiden.
Bspw. könnten zwei Prozesse zur gleichen Zeit nach stdout schreiben und im Falle von clamscan -i müsste man dann manuell wieder auf das Verzeichnis schauen, damit man unterscheiden kann, für welches Device die Ausgabe nun gilt.
Ich bräuchte also eine Lösung wo die Ausgabe nach stdout wieder sequentiell ist.
Vielleicht etwas, was die Ausgabe pro Prozess in einen Buffer schickt und dort quasi zwischenspeichert und dann jeden einzelnen Buffer nacheinander ausgibt?
Dazu habe ich noch keine Lösung gefunden.
EDIT:
Außer ich nutze die Variable $disk als Dateiname, in dem ich die Ausgabe mit angehängtem "> $disk.output" in eine Datei schreibe, dann hätte ich für jeden Prozess eine eigene *.output Datei. Das würde gehen. Eine Lösung, die ohne Schreibzugriff auf einen Datenträger auskommt, wäre mir allerdings noch lieber.
EDIT2:
Also so:
Beispiel, diesmal mit Dateien:
Code: Alles auswählen
time for datei in *.zip ; do sem -j 7 clamscan $datei > $datei.output ; done; sem --wait
Interessanterweise wird dabei dummerweise nur time viel zu früh ausgegeben.
Dafür wird aber wenigstens jedes Ergebnis in eine eigene Datei gespeichert.
Zeitmäßig habe ich in diesem Beispiel jetzt allerdings nichts gewonnen, denn clamscan auf alle Dateien in nur einem Prozess anzuwenden geht sogar schneller. Da ist dann die Größe der Dateien zu klein bzw. die Datenmenge zu klein.
Ich denke, clamscan muss da wohl die Virendatenbank bereit machen und das kostet wohl jede Menge Zeit.
Bei meinem großen Datenträgern sollte das aber so durchaus schneller gehen, als eine sequentielle abarbeitung.
Warum time vorher ausgegeben wird, als die for Schleife abgearbeitet ist, das müsste ich aber noch wissen und dann verhindern.
Time soll die Zeit ja erst ganz am Schluss ausgeben. Weiß jemand woran das liegen könnte?