Создайте файл, размер которого в байтах равен проценту свободного места на диске

416
pavium

Мне нужен был метод командной строки для создания файла, размер которого в байтах равен проценту свободного места на диске. Я собираюсь запускать его через cron каждые пять минут, но сначала подойдет скрипт оболочки.

Целевая платформа является BSD4.3 средой в DOMAIN / OS, поэтому у меня есть ksh, awk, sedи обычные команды BSD, но не GNU версия.

Я могу запустить команду lvolfs -a( не команду BSD), которая перечисляет свободное место на томе в следующем формате:

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

таким образом, кажется простым извлечь значения, в данном случае 57 и 91, идентифицируя их по шестнадцатеричным идентификаторам узлов, 4D72C и 52055, соответственно.

Я сразу подумал, что dd может это сделать, поэтому, сконцентрировавшись сначала на узле 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 

И dirlistвыглядит как

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

Это работает, и мне нужно будет повторить что-то подобное для узла 52055, но мне интересно, если ddэто единственный способ использовать действительно базовые команды BSD. Есть ли у кого-нибудь предложения?


РЕДАКТИРОВАТЬ: Еще немного справочной информации о целевой системе ... это HP / Apollo DN433 'Engineering Workstation', колени пчелы, когда она была выпущена в начале 80-х, но теперь примерно такая же впечатляющая, как система 486DX. Нативная ОС пытается имитировать Unix, предоставляя «среду» BSD4.3 с разумным набором команд BSD, но есть соблазн смешивать команды BSD и Aegis (например lvolfs), как я сделал здесь.

У меня есть две рабочие станции, каждая из которых управляет автоматическим испытательным оборудованием. Две рабочие станции объединены в сеть, и корневой сетевой каталог //включает в себя tr2 (идентификатор узла 4D72C) и tr3 (идентификатор узла 52055). Вы действительно не хотите или не должны знать все эти вещи - я просто хотел бы создать впечатление, что ничто не должно восприниматься как должное. Я не хочу, чтобы кто-то тратил слишком много времени на эти вещи - это моя работа, но я буду благодарен за любые ваши предложения. Оболочка Корн для меня все еще остается загадкой.

ОБНОВЛЕНИЕ: df -aкоманда в DOMAIN / OS дает

$ 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% 

Который, поскольку он упоминает более знакомые имена tr2 и tr3, может быть предпочтительным. Лишь небольшое препятствие в том, что мы получаем дисковое пространство используется не бесплатно, но это можно преодолеть.

4

1 ответ на вопрос

1
Dennis Williamson

Я бы использовал dd. Вы говорите "lvolfs -a (не команда BSD)". У тебя есть df? Это был бы более стандартный и переносимый способ получения информации об объеме использования.

Для этого не нужно создавать временный файл сценария. Вы должны быть в состоянии сделать:

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

или же

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 

(в зависимости от того, как организованы ваши файловые системы и как dfвыглядит вывод ).

Вы могли бы даже поместить второй в цикл:

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 

Внимательно изучите это, прежде чем использовать его, чтобы убедиться, что оно соответствует вашим намерениям.

Спасибо за предложение. Команда `lvolfs` является родной DOMAIN / OS и, конечно, дает другой формат для` df`. Я предпочитаю формат, заданный `lvolfs`. Мне не нужно беспокоиться о портативности. Я попробую использовать `df`, но мне придется подождать до понедельника, когда я вернусь на работу. pavium 14 лет назад 0
Мы думали о команде `df` и о том, насколько близко ее вывод напоминает то, к чему мы привыкли. Я отредактировал вопрос, чтобы добавить немного дополнительной информации о странной системе, над которой нужно работать. pavium 14 лет назад 0
Спасибо Деннис, я решил придерживаться `lvolfs -a`, но я использовал вашу идею удаления временного файла. Я должен попытаться еще немного толкнуть ksh на этом древнем оборудовании. pavium 14 лет назад 0

Похожие вопросы