4

Мне нужен был метод командной строки для создания файла, размер которого в байтах равен проценту свободного места на диске. Я собираюсь запускать его через 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, может быть предпочтительным. Единственное небольшое препятствие состоит в том, что мы используем свободное место на диске, но это можно преодолеть.

1 ответ1

1

Я бы использовал 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=${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=${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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .