[unix] создание потока для логов.(смысл названия внутри.)
$ mkfifo pipe
$ proga > pipe
$ cat pipe > /dev/null или cat pipe
screen
$ mkfifo pipe
$ proga > pipe
вот тут оно лочится. и ждёт пока кто-нибудь что-нибудь прочитает.
т.е. рядом запускать
cat pipe > /dev/null
а в перерывах его прибивать, Но это не подходит, т.к. отразится на работе проги в момент "переключения" cat'ов
зы: я вообще с той целью написал, чтоб кто-нибудь меня аргументированно обосрал. %
вообще это мелкий скриптец...
сейчас я его прибиваю просто и заново запускаю с другими параментрами.
иногда интересно позырить, что он там делает, а в файл не хочу - сильно быстро растёт
+1 к screen'y.
и объясните, наконец, что имеется в виду под screen.
это же "full-screen window manager that multiplexes a physical terminal between several processes".
каким образом оно умеет то, что нужно? %)
просто под скрином запустить и пусть прога срёт в него. при желании подгрузить сессию скрина поглядеть чего там.
просто так-то и файл можно крутить кучей разных способов.
наверное даже диск трогаться не будет вообще.
#prog >#prog >> file.ext
#tail -f file.ext
так вот чтобы файл крутить нужен какой-то промежуточный буфер, что автор и спросил. или учить скрипт писать в файл и переоткрывать его по SIG
что делать после No space left?
или учить скрипт писать в файл и переоткрывать его по SIGда, я изначально хотел такое предложить, но подумал, что автору наверное лень переделывать скрипт.
просто под скрином запустить и пусть прога срёт в него. при желании подгрузить сессию скрина поглядеть чего там.
это из танка по воробьям.
предложи проще
Млин, я далек от линукса, но по-моему screen — это как раз то, что нужно. Процесс под ним пишет по сути на экран, но этого не видно, пока этот самый экран не вызовешь. Красивое и простое решение.
что делать после No space left?выключать кампутер и ложиться спать
что переоткрывать-то?
вообще я в шоке, что ничего такого не предусмотрели.. вроде как стандартная операция.. хотя "терять" тоже не правильно....
а можно как-нибудь такой fifo, который не только одному процессу отдаёт, но все и одинакого, кто подключится к нему ?
переоткрывать файл лога. подменить его можно только переоткрыв
нет, это не стандартная проблема. на всех писателей не напасёшься. программа должна срать в лог и уметь обрабатывать сигналы.
можно
A FIFO ... It can be opened by multiple processes for reading or writing.
однако это не то что нужно
#!/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 Но вообще у него мегасинтаксис и это мегаудобная штуковина... правда разработка скрина насколько я понял почемуто встала, видать забросили...
правда разработка скрина насколько я понял почемуто встала, видать забросили...видно испугались что он раньше времени обретёт разум
прикольная штука, может даже может помочь в данном случае.
О сколько нам открытий чудных готовит юникс-вея дух... =)
по секрету скажу что это баинды на ScrollLock
Оставить комментарий
Phoenix
есть прога, которая плодит кучу логов.запускается
#prog > /dev/null
и уходит в демона.
хочу вместо /dev/null написать что-нибудь, чтобы в обычном режиме уходило в /dev/null, а если я захочу, то на экран, не перезапуская прогу.
должно ж быть что-нибудь вроде потоков консольных.