Ich hatte die Idee, einige Dekomprimierungsprogramme schnell zu vergleichen. ZB für gz würde ich den Befehl ausführen:
timeout 10 zcat foo.gz | wc -c
Dies würde die Datenmenge messen, die der Dekomprimierer in 10 Sekunden extrahieren könnte.
Das einzige Problem ist, dass es nicht funktioniert: Wenn zcat getötet wird, wird auch wc getötet, sodass ich nicht die Byteanzahl erhalte, sondern nur eine Terminated
Nachricht.
Die Frage ist also: Gibt es eine Möglichkeit, die Zählung von wc zu erhalten , indem entweder das Signal auf irgendeine Weise blockiert wird oder statt wc eine Alternative verwendet wird, die ein Ergebnis ausgibt, selbst wenn es ein Termsignal erhält.
Natürlich gibt es Alternativen:
In eine temporäre Datei schreiben:
timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x
Das Problem dabei ist, dass viel Speicher benötigt wird und auch Leistungseinbußen auftreten können.Stattdessen ulimit verwenden:
ulimit -t 10; zcat foo.gz | wc -c
Dies funktioniert auch, misst aber nur die CPU-Zeit, sodass eine Verlangsamung aufgrund von E / A (z. B. weil die Komprimierung schlechter ist und mehr Bytes von der Festplatte gelesen werden müssen) nicht gemessen wird.Kleinere Testdateien erstellen:
Das kann natürlich funktionieren und ist möglicherweise die schönste Lösung. Dadurch werden jedoch viele temporäre Dateien erstellt.
Antworten:
Sie können den Befehl timeout in eine Subshell einfügen und erfolgreich ausführen:
quelle
(timeout 10 <command> || :) | wc -c
Kurz nach dem Posten hatte ich den Gedanken, Named Pipes für den Prozess zu verwenden:
Das scheint zu funktionieren.
quelle