LINUX.ORG.RU

[[bash] неосилятор]


0

1

хочу получать вывод dd в течении жизни программы

dd if=/dev/sdc1 of=/dev/dm-0 2>&1 | awk '/copied/ { i = index($0, "("); j = index($0, ")"); print substr($0, 0, j),"at", $8, $9, "proceed"; }' &
и еспользовать его в качестве агрумента другой программы

чтоб dd выводил свое состояние, делаю:

while (true); do [ "`pidof dd`" = "" ] && break; sudo killall -SIGUSR1 dd; sleep 3;  done
так dd просто плюется в стандартный вывод, и никак не получается использовать его вывод как аргумент :(

например, если написать

dd if=/dev/sdc1 of=/dev/dm-0 2>&1 | awk '/copied/ { i = index($0, "("); j = index($0, ")"); print substr($0, 0, j),"at", $8, $9, "proceed"; }' |  while read line; do ./t2s -t "$line"; done
то он будет долго молчать и только после кончины dd появится вывод...

подскажите, пожалуйста, как воплотить задуманное?

Умвр.

У одном терминале делаю

vadim@host3:~$ env LANG=C dd if=/dev/zero of=/dev/null 2>&1 | awk '/copied/ { i = index($0, "("); j = index($0, ")"); print substr($0, 0, j),"at", $8, $9, "proceed"; }'
В другом:
while (true); do [ "`pidof dd`" = "" ] && break; killall -SIGUSR1 dd; sleep 3;  done
В первом получаю:
1006719488 bytes (1.0 GB) at 368 MB/s proceed
2257530368 bytes (2.3 GB) at 379 MB/s proceed
3549474816 bytes (3.5 GB) at 387 MB/s proceed

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

так эт нормально, второй dd не пашет как надо (тот у которого «while read line» в конце)

metawishmaster ★★★★ ()

>так dd просто плюется в стандартный вывод, и никак не получается использовать его вывод как аргумент :(

1) одностроки - религия? самому не тяжело?

2) совет [code]ksu@ksu:/tmp$ dd 2>zzz ksu@ksu:/tmp$ cat zzz 0+0 записей считано 0+0 записей написано скопировано 0 байт (0 B), 1,24053 c, 0,0 kB/c [/code]

3) ещё совет - _не_ юзайте sudo. С ним тяжко... Это всё-же костыль...

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

>> ещё совет - _не_ юзайте sudo. С ним тяжко... Это всё-же костыль...

В каком месте это костыль и чем же его заменить?

GotF ★★★★★ ()

Эм. Действительно, херня какая-то. Так работает:

#!/bin/bash

env LANG=C dd "$@" 2> >(
	grep 'copied'
) &

DD_PID=$!

while ps $DD_PID > /dev/null ; do
	kill -SIGUSR1 $DD_PID && sleep 3
done

А вот так уже нет:

#!/bin/bash

env LANG=C dd "$@" 2> >(
	grep 'copied' | grep 'copied'
) &

DD_PID=$!

while ps $DD_PID > /dev/null ; do
	kill -SIGUSR1 $DD_PID && sleep 3
done

Честно записываюсь в неосиляторы bash-а.

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

1) не люблю «>» в строке bash`а %)

читать неудобно :-(

Про sudo - это костыль, который позволяет одному юзеру исполнять команды как другой (не обязательно root). Там немного не так обрабатываются параметры, там что-то вроде эмуляции - sudo сама парсит команду, а потом запускает. Но не как bash.

# sudo -u ksu "dd 2>zzz"
sudo: dd 2>zzz: command not found
# sudo -u ksu dd 2>zzz
^C

Во втором случае сработало, вот только второй поток это второй поток sudo, а не dd... Иногда это существенно.

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

>и чем же его заменить?

sudo script.sh

ИМХО самое простое. И безопасно (если запретить всё, кроме этого скрипта. и сам скрипт 0700)

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

>> И безопасно

Безопасно — выполнять с повышенными привилегиями лишь то, что необходимо, а не всё подряд.

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

>Безопасно — выполнять с повышенными привилегиями лишь то, что необходимо, а не всё подряд.

я и говорю - разрешить только один конкретный скрипт, одному конкретному юзеру.

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

Да, пожалуй. Особенно в случае с такими командами как kill, что имеет место в данном случае. Я малость не подумал :)

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

>> su -c не вариант?

Вариант, но sudo может быть предпочтительнее благодаря гибкости.

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

> Разобрался, в чем проблема. Нужно принудительно отключать буферизацию, иначе данные просто остаются висеть в буфере потока.
ого! ну вообще мегареспект!!! я бы и не полумал в эту сторону...

metawishmaster ★★★★ ()

Особенно не вчитывался, но проблема в буферизации вывода. В awk используй fflush() для сброса буфера

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