[linux] redirection типа tee

a10063

можно ли организовать?
начитался man & info, но там, вроде как, написано что редиректить можно только в один файл
а задача у меня вот в чем: написал башскрипт, который делает кучу эх, а теперь хочу, чтоб он все то, что выводил, еще и в лог заносил!
я придумал три варианта:
1) запускать так: ./script | tee log
2) поcле каждого эха: | tee log
3) запускать самого себя как в первом пункте с доп. параметром
варианты расположены в порядке наибольшего предпочтения
напишите, если знаете, про потоки в стиле tee или посоветуйте альтернативное решение (главное - чтоб править мало было и было некриво)

bjo999

при чем тут потоки в стиле tee?
тебе нужны подобные утилитки? - смотри в мане see also
или в мане по башу(? может еще где) - что такое перенаправление ввода вывода и pipe, тотгда ты сам программу tee напишеь в пять минут

a10063

все это смотрел уже. pipe, насколько я понимаю, меня не устраивает. с потоками: если перенаправить stdout, то ничего на экран не будет выводиться...
что такое see also?
посоветуй что-нибудь конкретнее, плиз

Ivan8209

Оно написано в самом низу man page.
---
...Я работаю антинаучным аферистом...

a10063

а... спасибо.
да, это тоже смотрел. я уж обчитался про потоки. мож че не понял?
а почему, собственно, не сделали перенаправление на множество дескрипторов?

Ivan8209

Ты подумай, как это сделать на уровне ядра.
---
...Я работаю антинаучным аферистом...

bjo999

почему не сделали, сделали, сам напиши, коль разобрался...

Ivan8209

Поясни.
---
...Я работаю антинаучным аферистом...

bjo999

скажи какую задачу тебе решить?
как это тебя пайп не устраивает, когда tee их и использует...
а будет выводиться или нет - только от тебя зависит...
скажи точнее - чего ты хочешь от этотго всего, а лучше почитай Робачевского...
мож у меня взять, токма верни...

abrek

чувак, нифига не понял, что ты хочешь собственно? Чем не устраивает каждый из вариантов?

a10063

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

bjo999

при чем тут я дро не понял, а потому -
создаем пайп ( pipe[])
pipe[1] одному процессу на вывод, pipe[0] любому количеству процессов на вход...
если честноо, то не знаю, вроде должно работать..
для таких вещей естьь сокеты...
если хочешь наоборот - то вариантов слишком много, как этот будет обрабатываться...

Ivan8209

Насколько понял, речь идёт, всё-таки, про трубы.
Если давать по наследованию один поток на несколько процессов, то они не устроят гонки с получением потока по частям?
Сокеты, есть подозрение, так же.
Можно, кажется, грязно похакать, перебив LibC и переписав загрузочные скрипты.
---
...Я работаю антинаучным аферистом...

Ivan8209

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

bjo999

ты чего добиться хочешь?
это же атомарные операции

a10063

в общем-то цель простая: хочу запускать ./script со своими параметрами без тии, а он бы мне выводил на экран, как раньше, и еще в лог добавлял все, что выводит
помимо того, хочу, чтобы это было некриво
все свои варианты считаю достаточно кривыми...

a10063

ура-а-а-а! кто-то понял, чего я хочу!

Ivan8209

Как я понял, задача такая.
Писатель: АБВГД...
Читатель 1-й: АБВГД...
Читатель 2-й: АБВГД...
По-моему, это ``tee''.
На уровне ядра, без хака, такое не делается.
(Особо извратные драйвера не берём.)
---
...Я работаю антинаучным аферистом...

abrek

не понял
чем вариант 1 кривой?

bjo999

1) разделяемая память
2) семафоры
3)сокеты
один процесс может передать многим, иначе нужна программа-сервер, что бы обрабатывать это так как надо тебе...

bjo999


а tee как это делает по твоему?

a10063

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

Ivan8209

Видимо тем, что человеку лень написать что-то вроде:
sed 's/$/| tee log/' my-script.sh >my-script.sh.tmp ; mv my-script.sh.tmp my-script.sh
---
...Я работаю антинаучным аферистом...

Ivan8209

Человеку не нравится, что должна быть третья программа.
Её вызов надо прописывать руками отдельно.
Всякий раз.
``tee'', сам понимаешь, открывает на вывод несколько потоков.
---
...Я работаю антинаучным аферистом...

bjo999

я вообщем не понял вообще поставленой задачи...
надо что бы куча потоков могла передать одному в один канал? или один куче? и то и другое делаетьтся стандартным IPC

bjo999

фу, доперло...
просто зачем нагружать систему лишними утилитами, когда этими можно сделать все...
пусть напишет свой вариант echo, что бы мог писать одновременно в файл и в stdout

abrek

странный ты
как же он будет знать, если ты ему не говоришь?

Ivan8209

Человеку лень прописывать кучу раз вызов третьей программы.
Если б можно было сказать: "А теперь, всё пишущееся в stdout, пишем ещё и в log," --- отменив потом такое извращение, было бы здорово.
Только нет такого готового решения.
---
...Я работаю антинаучным аферистом...

a10063

во-первых, у меня там не одни только эхи
во-вторых, я забочусь о простом изменении/добавлении

Ivan8209

А теперь ты объясни мне, чем тебе не нравится ``tee''.
---
...Я работаю антинаучным аферистом...

a10063

все правильно
а что нет - жаль!

bjo999

зачем перегружать систему лишими проверками и вещами, которые решают лишь твои локальные проблемы, которые вообщем-то не проблемы...

bjo999

мне-то все нравиться, а он похоже просто ленится написать где надо - tee

Ivan8209

Ты, всё-таки, объясни мне, чем тебе не нравится изменение написанного скрипта седом?
---
...Я работаю антинаучным аферистом...

a10063

ну я же пишу скрипт, все-таки...
заложу в него знание (см. 3-й вариант - он, м.б. самый лучший, только возни много, т.к. у меня свои параметры есть: конфликты всякие и т.п.)

Ivan8209

man sed
Кому руки дадены?
---
...Я работаю антинаучным аферистом...

bjo999

человек, вообще по жизни тварь ленивая

Ivan8209

Для ленивых есть ``sed''.
---
...Я работаю антинаучным аферистом...

bjo999

и man по нему ленивым читать влом
от того такие вопросы...

a10063

я еще не на ты с ним (с седом но как я понял, ты предлагаешь в конце каждой строки поставить ' | tee log'
если так, то это не то

Ivan8209

Тебе что больше лень, набивать сотню раз ``|tee log'' или написать один раз вызов ``sed''?
---
...Я работаю антинаучным аферистом...

Ivan8209

А значёчек поставить там, где надо будет вставлять ``tee'', догадаться сложно?
Сколько раз ты используешь, например, ``@'' или ``#''?
А ``@#''?
---
...Я работаю антинаучным аферистом...

a10063

если б я хотел править в лоб - правил бы даже вручную!
я научиться большему хочу, пока пишу скрипт, многое понять...
если б так уж ленился - не читал бы маны по перенаправлению

bjo999

почитай лучше по IPC что-нибудь и проо устройство системы, так быстрее поймешь...

a10063

@ и # я часто использую, правда не в конце строки
'@#' не использую, но тогда уж проще под иксами через буфер повставлять

Ivan8209

Пусть лучше про ``sed'' и ``awk'' прочитает.
Очень нужные в деле вещи.
---
...Я работаю антинаучным аферистом...

Ivan8209

Ну придумай себе сокращение, в чём дело-то!
---
...Я работаю антинаучным аферистом...

a10063

да, нужные
я читаю про них по мере необходимости
sed мне когда-то очень помог!

bjo999

перл заменит и то и другое, правда не так удобно...
пусть лучше с азов начать, а-то "перенаправление" - это в басше так названо,
а в системе - IPC(сокеты, семафоры,сигналы, разд.память) вроде так...

Ivan8209

Большая часть делается просто на трубах.
---
...Я работаю антинаучным аферистом...

a10063

так нафига тогда сед? какая разница для буфера - вставлять большую строку или маленькую?

Ivan8209

Да, а перл --- отстой.
---
...Я работаю антинаучным аферистом...

bjo999

вполне, еще на сокетах - если процессы не одной ветки....

Ivan8209

Буфер может и для другого понадобиться.
Можно, конечно, макрос написать.
---
...Я работаю антинаучным аферистом...

sergey_m

Если б можно было сказать: "А теперь, всё пишущееся в stdout, пишем ещё и в log," --- отменив потом такое извращение, было бы здорово.
Для этого придется переписать скрипт на perl

Ivan8209

Каким образом?
Как это что-то изменит?
---
Прогноз погоды. Песня на сегодня: "Дождь над Иссык-Кулем сплошной пеленой..."

sergey_m

В cookbook описан пример фильтрования STDOUT. Вкратце механизм заключается в том, что forkается ребёнок, вставляется в конвейер и затем фильтрует STDOUT. Удобный приём.

Ivan8209

То есть всё время кто-то висит, перехватывая stdout и записывая его, куда надо?
---
"Верь сводке погоды, но доверяй --- интуиции.
Будь особенно бдителен, когда всё хорошо и нет поводов для тревоги". ("Белое проклятие")
Прогноз погоды. Песня на сегодня: "Дождь над Иссык-Кулем сплошной пеленой..."

sergey_m

Тебе в ru.os.cmp.

sergey_m

Да, типа того. Я cookbook на работе оставил, сейчас не могу заглянуть.

sergey_m

imho, первый наименнее кривой. Запускается один раз tee. Если ты будешь из скрипта tee запускать, то ты его запустишь намного больше раз. На нагруженной машине это будет тормозить.

Ivan8209

СПАСИБО, НЕ НАДО!
Чур меня, чур!
---
"Верь сводке погоды, но доверяй --- интуиции.
Будь особенно бдителен, когда всё хорошо и нет поводов для тревоги". ("Белое проклятие")
Прогноз погоды. Песня на сегодня: "Дождь над Иссык-Кулем сплошной пеленой..."

sergey_m

Помню в LOR был длиннющий тред про программу


cat "test... test... test..." | perl -e '$?s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'.


Один из комментариев был следующий: "Это еще раз доказывает, что perl - отстой".

abrek

На самом деле, алгоритмы - отстой
Как и всё остальное

sergey_m

Кроме microsoft vacuum cleaner.

sergey_m

Может быть проще в начале скрипта сделать функцию my_echo и не париться?
Оставить комментарий
Имя или ник:
Комментарий: