[unix] создание потока для логов.(смысл названия внутри.)
рискну предположить, что-то вроде:
$ mkfifo pipe
$ proga > pipe
$ cat pipe > /dev/null или cat pipe
$ mkfifo pipe
$ proga > pipe
$ cat pipe > /dev/null или cat pipe
screen
$ mkfifo pipe
$ proga > pipe
вот тут оно лочится. и ждёт пока кто-нибудь что-нибудь прочитает.
т.е. рядом запускать
cat pipe > /dev/null
а в перерывах его прибивать, Но это не подходит, т.к. отразится на работе проги в момент "переключения" cat'ов
ну да, лочится, но я надеюсь, что это ты только для дебага такую конструкцию юзаешь. 
зы: я вообще с той целью написал, чтоб кто-нибудь меня аргументированно обосрал. %

зы: я вообще с той целью написал, чтоб кто-нибудь меня аргументированно обосрал. %
неа, не только..
вообще это мелкий скриптец...
сейчас я его прибиваю просто и заново запускаю с другими параментрами.
иногда интересно позырить, что он там делает, а в файл не хочу - сильно быстро растёт
вообще это мелкий скриптец...
сейчас я его прибиваю просто и заново запускаю с другими параментрами.
иногда интересно позырить, что он там делает, а в файл не хочу - сильно быстро растёт
+1 к screen'y.
а shared memory можно как-нибудь из баша использовать?
и объясните, наконец, что имеется в виду под screen.
это же "full-screen window manager that multiplexes a physical terminal between several processes".
каким образом оно умеет то, что нужно? %)
и объясните, наконец, что имеется в виду под screen.
это же "full-screen window manager that multiplexes a physical terminal between several processes".
каким образом оно умеет то, что нужно? %)
просто под скрином запустить и пусть прога срёт в него. при желании подгрузить сессию скрина поглядеть чего там.
а это аналогично > /dev/null? или аналогично > file?
просто так-то и файл можно крутить кучей разных способов.
наверное даже диск трогаться не будет вообще.
просто так-то и файл можно крутить кучей разных способов.
наверное даже диск трогаться не будет вообще.
#prog >#prog >> file.ext
#tail -f file.ext
из предложенного это более всего аналогично nohup -)
так вот чтобы файл крутить нужен какой-то промежуточный буфер, что автор и спросил. или учить скрипт писать в файл и переоткрывать его по SIG
так вот чтобы файл крутить нужен какой-то промежуточный буфер, что автор и спросил. или учить скрипт писать в файл и переоткрывать его по SIG
> #prog >> file.ext
что делать после No space left?
что делать после No space left?
или учить скрипт писать в файл и переоткрывать его по SIGда, я изначально хотел такое предложить, но подумал, что автору наверное лень переделывать скрипт.
просто под скрином запустить и пусть прога срёт в него. при желании подгрузить сессию скрина поглядеть чего там.
это из танка по воробьям.
предложи проще
Млин, я далек от линукса, но по-моему screen — это как раз то, что нужно. Процесс под ним пишет по сути на экран, но этого не видно, пока этот самый экран не вызовешь. Красивое и простое решение.
что делать после No space left?выключать кампутер и ложиться спать

про sig я не понял.
что переоткрывать-то?
вообще я в шоке, что ничего такого не предусмотрели.. вроде как стандартная операция.. хотя "терять" тоже не правильно....
а можно как-нибудь такой fifo, который не только одному процессу отдаёт, но все и одинакого, кто подключится к нему ?
что переоткрывать-то?
вообще я в шоке, что ничего такого не предусмотрели.. вроде как стандартная операция.. хотя "терять" тоже не правильно....
а можно как-нибудь такой fifo, который не только одному процессу отдаёт, но все и одинакого, кто подключится к нему ?
signal
переоткрывать файл лога. подменить его можно только переоткрыв
нет, это не стандартная проблема. на всех писателей не напасёшься. программа должна срать в лог и уметь обрабатывать сигналы.
можно
A FIFO ... It can be opened by multiple processes for reading or writing.
однако это не то что нужно
переоткрывать файл лога. подменить его можно только переоткрыв
нет, это не стандартная проблема. на всех писателей не напасёшься. программа должна срать в лог и уметь обрабатывать сигналы.
можно
A FIFO ... It can be opened by multiple processes for reading or writing.
однако это не то что нужно
можно, лови прогу, я года 4-ре назад написал:
как её юзать: запускаешь прогу. потом открываешь терминалы хоть 10 штук и пишешь telnet 123.234.13.23 1234 и смотришь что тебе на вывод валится. Т.е. это проброс лога в сокет для нескольких клиентов одновременно.
#!/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 и смотришь что тебе на вывод валится. Т.е. это проброс лога в сокет для нескольких клиентов одновременно.
да, это на порядок проще чем запустить screen prog и запомнить пару комбинаций кнопок
Ты скажи, я хоть правильно понял, как screen работает?
правильно. Следует учитывать, что это не единственная полезная функциональность screen'a. Так же можно перенаправить вывод всех скриптов на один и тот же скрин, есть и много других полезных функций, но не все они нужны топикстартеру в данном случае.
Пользоваться скрином вот так:
пишешь для своей проги в /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 Но вообще у него мегасинтаксис и это мегаудобная штуковина... правда разработка скрина насколько я понял почемуто встала, видать забросили...
пишешь для своей проги в /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 Но вообще у него мегасинтаксис и это мегаудобная штуковина... правда разработка скрина насколько я понял почемуто встала, видать забросили...
правда разработка скрина насколько я понял почемуто встала, видать забросили...видно испугались что он раньше времени обретёт разум
кстати, не знал, что можно сделать Ctrl+S: "Halt output to to screen" и Ctrl+Q: "Restart output to screen"
прикольная штука, может даже может помочь в данном случае.
прикольная штука, может даже может помочь в данном случае.
О сколько нам открытий чудных готовит юникс-вея дух... =)
по секрету скажу что это баинды на ScrollLock 

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