Erstellen Sie eine Datei, deren Größe in Byte dem Prozentsatz des freien Speicherplatzes auf einer Festplatte entspricht

451
pavium

Ich brauchte eine Befehlszeilenmethode zum Erstellen einer Datei, deren Größe in Byte der Prozentsatz des freien Speicherplatzes auf einer Festplatte ist. Ich beabsichtige, es alle fünf Minuten per cron auszuführen, aber zuerst wird ein Shell-Skript verwendet.

Die Zielplattform ist die BSD4.3 Umgebung in DOMAIN / OS, so habe ich ksh, awk, sedund die üblichen BSD - Befehle, aber nicht GNU - Versionen.

Ich kann einen Befehl ausführen lvolfs -a( keinen BSD-Befehl), der den freien Speicherplatz in diesem Format aufführt:

 # free # total % free node id entry directory 732532 1295672 57 4D72C / 3787184 4165732 91 52055 //tr3 ------------------------------- 4519716 5461404 82.76% 2 volumes. 

Daher scheint es unkompliziert, die Werte zu extrahieren, in diesem Fall 57 und 91, die durch die hexadezimalen Knoten-IDs 4D72C bzw. 52055 identifiziert werden.

Ich dachte sofort, 'dd kann das', also konzentrierte ich mich zuerst auf Knoten 4D72C:

/com/lvolfs -a | \ awk -e '/4D72C/ { print $3 }' | \ sed -e 's|^|dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=|' | \ sed -e 's|$| count=1|' >//tr2/archive/dirlist  . //tr2/archive/dirlist 

Und dirlistsieht so aus

dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=57 count=1 

Es funktioniert, und ich muss so etwas für den Knoten 52055 wiederholen, aber ich frage mich, ob dies dddie einzige Möglichkeit ist, wirklich grundlegende BSD-Befehle zu verwenden. Hat jemand irgendwelche Vorschläge?


BEARBEITEN: Weitere Hintergrundinformationen zum Zielsystem ... Es handelt sich um eine HP / Apollo DN433 'Engineering Workstation', die Knie der Biene, als sie in den frühen 80er Jahren auf den Markt kam, aber jetzt so beeindruckend ist wie ein 486DX-System. Das native Betriebssystem versucht, Unix zu imitieren, indem es eine BSD4.3-Umgebung mit einem angemessenen Satz von BSD-Befehlen bereitstellt, aber es besteht die Versuchung, BSD- und Aegis- Befehle (wie hier lvolfs) zu mischen .

Ich habe zwei Workstations, von denen jede die automatische Testausrüstung steuert. Die beiden Workstations sind miteinander vernetzt und das Netzwerkstammverzeichnis //enthält tr2 (Knotennummer 4D72C) und tr3 (Knotennummer 52055). Sie wollen oder müssen das alles nicht wirklich wissen - ich möchte nur den Eindruck erwecken, dass nichts selbstverständlich ist. Ich möchte nicht, dass jemand zu viel Zeit für dieses Zeug verschwendet - das ist meine Aufgabe, aber ich würde mich über Anregungen freuen. Die Korn-Shell ist für mich immer noch ein Rätsel.

UPDATE: Der df -aBefehl in DOMAIN / OS gibt

$ df -a Filesystem kbytes used avail capacity Mounted on /dev/wn96a 1295672 563904 731768 44% //tr2 /dev/wn96a 4165732 379804 3785928 9% //tr3 ---------------------------------- 5461300 943700 4517600 17% 

Da die bekannteren Namen tr2 und tr3 erwähnt werden, ist dies möglicherweise vorzuziehen. Die einzige leichte Hürde ist, dass wir Speicherplatz bekommen verwendet nicht frei, aber diese überwunden werden können.

4

1 Antwort auf die Frage

1
Dennis Williamson

Ich würde verwenden dd. Sie sagen "lvolfs -a (kein BSD-Befehl)". Haben Sie df? Dies wäre eine standardisierte und tragbare Methode, um Informationen zur Datenträgerauslastung zu erhalten.

Es sollte nicht notwendig sein, eine temporäre Skriptdatei zu erstellen. Sie sollten in der Lage sein:

dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=\ $(/com/lvolfs -a | awk -e '/4D72C/ { print $3 }') count=1 

oder

avail=$(df /usr | awk -e 'NR==2 { print $5 }') avail=$ # strip off the percent sign dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=$avail count=1 

(Abhängig davon, wie Ihre Dateisysteme organisiert sind und wie die Ausgabe von dfaussieht).

Sie könnten sogar die zweite in eine Schleife setzen:

for fs in / /usr /home # list the ones you want to include do avail=$(df $fs | awk -e 'NR==2 { print $5 }') avail=$ # strip off the percent sign # create a file on the particular filesystem/mount point dd if=/dev/rdsk of=//$fs/test/data/tr2.free bs=$avail count=1 done 

Überprüfen Sie dies sorgfältig, bevor Sie es verwenden, um sicherzustellen, dass es das tut, was Sie beabsichtigen.

Danke für den Vorschlag. Der Befehl 'lvolfs' ist nativ DOMAIN / OS und gibt natürlich ein anderes Format als 'df'. Ich bevorzuge das von lvolfs angegebene Format. Ich muss mir nicht wirklich um die Portabilität sorgen. Ich versuche es mit `df`, aber es muss bis Montag warten, wenn ich wieder zur Arbeit gehe. pavium vor 14 Jahren 0
Ich habe über den `df`-Befehl nachgedacht und wie sehr seine Ausgabe dem ähnelt, was wir gewohnt sind. Ich habe die Frage bearbeitet, um ein wenig mehr Hintergrundinformationen über das eigentliche System hinzuzufügen, an dem gearbeitet werden soll. pavium vor 14 Jahren 0
Danke Dennis, ich entschied mich für `lvolfs -a`, aber ich habe Ihre Idee genutzt, die temporäre Datei zu löschen. Ich muss versuchen, `ksh 'auf dieser uralten Ausrüstung etwas mehr zu drücken. pavium vor 14 Jahren 0