LINUX.ORG.RU

dd и return коды


1

1

Есть следующий кусок скрипта:

if dd if=/dev/zero of=/dev/sda bs=1M count=1; then
sudo poweroff
fi

И он срабатывает как надо.

Но если count=1 убрать, то sudo poweroff не работает. Почему?

★★

Последнее исправление: Hirnfuhler (всего исправлений: 1)

Потому что он начинает записывать диск /dev/sda нулями по одному мегабайту, пока на диске есть место. Или ты о причинах, почему он не выключается после? Потому что в последней операции записи он смог записать меньше мегабайта.

om-nom-nimouse ★★
()

Но если count=1 убрать, то sudo poweroff не работает. Почему?

Заполнится весь диск, место кончится, dd выйдет с ненулевым кодом, условие не сработает, команда sudo poweroff не выполнится. Если нужно, чтобы она выполнялась всегда после завершения работы dd, то нужно сделать так:

dd if=/dev/zero of=/dev/sda bs=1M count=1; sudo poweroff

Кстати, странный какой-то юзер у тебя, что права на запись в /dev/sda есть, а poweroff через sudo, значит, не рут. Неужели в группе disk состоит?

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

Мне нужно заполнить диск нулями, но сделать poweroff только в случае успешного завершения dd. А юзер и правда странный, но это уж такая хрень с tinycorelinux. ;) Там всё кастрированное.

Hirnfuhler ★★
() автор топика
Ответ на: комментарий от Hirnfuhler

Ну так и не употребляй bs=1M, и все будет в порядке.
Если тебе так важна скорость, подбери bs так, чтобы емкость диска была ему кратна.

ABW ★★★★★
()
Ответ на: комментарий от Hirnfuhler

Тогда парсить вывод dd или запускать два dd, одну с заданным count и большим bs, а другую на конец, с заданным seek=. В любом случае, сначала узнавать размер устройства в блоках.

mky ★★★★★
()
Ответ на: комментарий от ABW

Да, наврал, count в таком случае все равно надо вычислять.
Например:

LC_ALL=C fdisk -l /dev/sda |
   sed -n '/^Disk \/dev/ s|.*, \([0-9]*\) bytes$|\1|p'
должно дать объем в байтах.

ABW ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.