[unix] создание потока для логов.(смысл названия внутри.)

Phoenix

есть прога, которая плодит кучу логов.
запускается
#prog > /dev/null
и уходит в демона.
хочу вместо /dev/null написать что-нибудь, чтобы в обычном режиме уходило в /dev/null, а если я захочу, то на экран, не перезапуская прогу.
должно ж быть что-нибудь вроде потоков консольных.

slonishka

рискну предположить, что-то вроде:
$ mkfifo pipe
$ proga > pipe
$ cat pipe > /dev/null или cat pipe

vall

screen

Phoenix

$ mkfifo pipe
$ proga > pipe

вот тут оно лочится. и ждёт пока кто-нибудь что-нибудь прочитает.
т.е. рядом запускать
cat pipe > /dev/null
а в перерывах его прибивать, Но это не подходит, т.к. отразится на работе проги в момент "переключения" cat'ов

slonishka

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

Phoenix

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

yroslavasako

+1 к screen'y.

slonishka

а shared memory можно как-нибудь из баша использовать?
и объясните, наконец, что имеется в виду под screen.
это же "full-screen window manager that multiplexes a physical terminal between several processes".
каким образом оно умеет то, что нужно? %)

dgaf

просто под скрином запустить и пусть прога срёт в него. при желании подгрузить сессию скрина поглядеть чего там.

slonishka

а это аналогично > /dev/null? или аналогично > file?
просто так-то и файл можно крутить кучей разных способов.
наверное даже диск трогаться не будет вообще.

Barbie29

#prog >
#prog >> file.ext
#tail -f file.ext

dgaf

из предложенного это более всего аналогично nohup -)
так вот чтобы файл крутить нужен какой-то промежуточный буфер, что автор и спросил. или учить скрипт писать в файл и переоткрывать его по SIG

dgaf

> #prog >> file.ext
что делать после No space left?

slonishka

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

Irina22

просто под скрином запустить и пусть прога срёт в него. при желании подгрузить сессию скрина поглядеть чего там.

это из танка по воробьям.

dgaf

предложи проще

saveliev_a

Млин, я далек от линукса, но по-моему screen — это как раз то, что нужно. Процесс под ним пишет по сути на экран, но этого не видно, пока этот самый экран не вызовешь. Красивое и простое решение.

Barbie29

что делать после No space left?
выключать кампутер и ложиться спать :)

Irina22

про sig я не понял.
что переоткрывать-то?
вообще я в шоке, что ничего такого не предусмотрели.. вроде как стандартная операция.. хотя "терять" тоже не правильно....
а можно как-нибудь такой fifo, который не только одному процессу отдаёт, но все и одинакого, кто подключится к нему ?

dgaf

signal
переоткрывать файл лога. подменить его можно только переоткрыв
нет, это не стандартная проблема. на всех писателей не напасёшься. программа должна срать в лог и уметь обрабатывать сигналы.
можно
A FIFO ... It can be opened by multiple processes for reading or writing.
однако это не то что нужно

Barbie29

можно, лови прогу, я года 4-ре назад написал:

#!/usr/bin/perl -w

use File::Tail;
use IO::Socket;
use Symbol;
use POSIX;

$l = '/var/log/httpd/access_log';
$PORT=1234;

$server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $PORT, Listen => SOMAXCONN,
Type => SOCK_STREAM, Reuse => 1) or die " making socket: $@";

$PREFORK =5;
$MAX_CLIENTS_PER_CHILD = 5;
%children;
$children=0;
make_new_child for(1 .. $PREFORK);
$SIG{CHLD}=\&REAPER;
$SIG{INT}=\&HUNTSMAN;
while(1){
sleep;
for($i=$children; $i<$PREFORK; $i++){make_new_child}
}

sub tail_socket{
return $fi = File::Tail->new(
name => $l,
maxinterval => 0.1,
adjustafter => 1000000000,
interval => 4,
tail => 0)
}

sub make_new_child{
my $pid;
my $sigset;
$sigset=POSIX::SigSet->new(SIGINT);
sigprocmask(SIG_BLOCK, $sigset) or die "can't block SIGINT for fork: $!\n";
die "fork: $!" unless defined($pid = fork);
if($pid){
sigprocmask(SIG_UNBLOCK, $sigset) or die "can't unblock SIGINT for fork: $!\n";
$children{$pid}=1;
$children++;
return;
} else {
$SIG{INT} = 'DEFAULT';
$SIG{CHLD}='IGNORE';
sigprocmask(SIG_UNBLOCK, $sigset) or die "can't unblock SIGINT for fork: $!\n";
for($i=0; $i<$MAX_CLIENTS_PER_CHILD; $i++){
$client = $server->accept or last;
&tail_socket;
while(1){
print $client $_ while($_=$fi->read);
}
} exit;
}
}

sub HUNTSMAN{
local($SIG{CHLD})='IGNORE';
kill 'INT' => keys %children;
exit;
}

sub REAPER{
$SIG{CHLD}=\&REAPER;
my $pid = wait;
$children--;
delete $children{$pid};
}


как её юзать: запускаешь прогу. потом открываешь терминалы хоть 10 штук и пишешь telnet 123.234.13.23 1234 и смотришь что тебе на вывод валится. Т.е. это проброс лога в сокет для нескольких клиентов одновременно.

vall

да, это на порядок проще чем запустить screen prog и запомнить пару комбинаций кнопок

saveliev_a

Ты скажи, я хоть правильно понял, как screen работает?

yroslavasako

правильно. Следует учитывать, что это не единственная полезная функциональность screen'a. Так же можно перенаправить вывод всех скриптов на один и тот же скрин, есть и много других полезных функций, но не все они нужны топикстартеру в данном случае.

Barbie29

Пользоваться скрином вот так:
пишешь для своей проги в /etc/rc.d/rc.local последней строчкой
screen -d -m -A -S proga programm.bin
эта строчка автозапуском запускает при загрузке машины твою прогу в скрин. ребутишь машину.
залогиниваешься под рутом, например, и говоришь команду
[observ root]# screen -rd
There are several suitable screens on:
1177.proga (Detached)
31164.pts-7.observ (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
[observ root]#
чтобы вытащить прогу из скрина пишешь
screen -x 1177.proga
эту команду на один и тот-же скрин можно ввести из 30 разных терминалов. Своеобразный чат устроить =)
Чтобы выйти из скрина нашимаешь следующую последовательность клавиш:
ctrl+a после обе отпускаешь, и жмешь кнопку d
В скрине можно даже X-ы запускать.
Вот так можно пользоваться screen Но вообще у него мегасинтаксис и это мегаудобная штуковина... правда разработка скрина насколько я понял почемуто встала, видать забросили...

vall

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

slonishka

кстати, не знал, что можно сделать Ctrl+S: "Halt output to to screen" и Ctrl+Q: "Restart output to screen"
прикольная штука, может даже может помочь в данном случае.

vall

О сколько нам открытий чудных готовит юникс-вея дух... =)

yolki

по секрету скажу что это баинды на ScrollLock ;)
Оставить комментарий
Имя или ник:
Комментарий: