Ru-Board.club
← Вернуться в раздел «Ikonboard v.2»

» Обнуление или исчезновение топиков

Автор: lynx
Дата сообщения: 08.06.2003 01:30
Marilda


Цитата:
Не думаю, чтобы причина сбоев была в этом, потому что пару раз сносили часов в 7 мск, то есть при минимальной нагрузке.


Шел - это доступ на сервер по telnet или SSH, читай:
http://forum.ru-board.com/topic.cgi?forum=21&topic=28#1
соб-но ты это читала.

Так вот есть у тебя шел?

Если есть, то какая ОС на сервере установлена?

Потому как любая ОС (в смысле нормальная - никс) ведет логи всего.
например FreeBSD ведет лог своей деятельности в файл /var/log/messages - он доступен для чтения всем. Посмотри, что говорит система, когда у тебя падало.

Например, у меня смотри, что при этом она писала:

Apr 28 15:03:01 имя_сервера /kernel: pid 67758 (perl), uid 1002, was killed: out of swap space
Apr 28 15:03:03 имя_сервера /kernel: swap_pager_getswapspace: failed

Переводится это так примерно:

ядро получило очередной сигнал от перлового процесса, процесс порожден юзером 1002 (из-под этого юзера запущен Апач), процесс был убит, потому что свопового пространства не хватило для его выполнения.



А у тебя как?

Или хотя бы зайди в логи Апача и посмотри, что там, начни в error.log или посмотри по access.log, какие файлы запрашивались перед падением.


И еще.


Цитата:
Один раз зашла на форум, а он уже почти сутки как убит.


А что значит убит? Как это выглядит то?
Автор: Marilda
Дата сообщения: 08.06.2003 01:52
lynx

Цитата:
А что значит убит? Как это выглядит то?

Удали (переименуй) на секундочку allforums.cgi и boardstats.cgi и увидишь

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



Добавлено
Архивы gz за 6 дней только, наверное, остальное удаляется. Нужное посмотреть не смогу, нет уже этих логов. В след. раз сразу лог скачаю.


Цитата:
начни в error.log или посмотри по access.log, какие файлы запрашивались перед падением.

Это я и без логов знаю - какие обнулены, такие и запрашивались
Автор: Shurik
Дата сообщения: 08.06.2003 14:11
Marilda

Цитата:
А сколько надо, чтоб достаточно было?

хм... вообще-то если форум раскрученный (и часто пишут), то если бы я сказал, что 5 метров, то это было бы мало, ибо эти 5 метров у тебя скушаются может быть за неделю. Поэтому чем больше места, тем лучше.

Цитата:
Заодно научи, плз, как проверить Не с калькулятором по папкам ходить, наверное, где-то цифорку вывести можно?

вообще я подумал, что у тебя платный хостинг. На любом платном хостинге должна быть панель управления - там и увидишь. Если нет такого - спроси админов сколько у тебя свободного места.
Не скрипт же писать для подсчета. В крайнем случае придется с калькулятором по папочкам походить - выделяешь все файлы в total commander (бывший WC) и смотришь объем. Ты вообще знаешь сколько тебе выделили места?

Цитата:
Не думаю, чтобы причина сбоев была в этом, потому что пару раз сносили часов в 7 мск, то есть при минимальной нагрузке.

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

Код: $filetoopen = "$ikondir" . "forum$inforum/list.cgi";
if (-z $filetoopen) {
&recount;
}
Автор: Marilda
Дата сообщения: 08.06.2003 15:37
Shurik
Спасибо, нашла инфу. Место есть, больше 100 мегов. error_log тоже нашла с последним сбоем - ничего там особенного, то самое сообщение, которое она пишет при обнуленном boardstats.cgi
[Дата Время] ikonboard.cgi: /pub/home/домен/cgi-bin/forum/data/boardstats.cgi did not return a true value at ikonboard.cgi line 85

lynx
Насчет оптимизации. Вот не думаю я, что это в принципе эффективная мера борьбы с обнулениями. Нет, это все хорошо, полезно на уровне разработчика борды, но не админа-пользователя. Допустим, причина в перегрузке сервера (что тоже еще не факт). Ну допустим, довел программер-гений IB до совершенства. Но на сервере же он не один! Перегрузить серв могут другие пользователи. Эту причину, кстати, и назвал мне хостер полгода назад.

Кстати, есть системные требования для IB (сколько памяти и т.д.), в рамках которых она должна работать как часы?

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

Возможно ли, например, что установленный на сервере Перл что-то не так обрабатывает? (извините, я слабо представляю Перл и эти все процессы) Перл он и в Африке Перл, или разные версии есть?
Автор: Shurik
Дата сообщения: 08.06.2003 17:09
Marilda

Цитата:
Дата Время] ikonboard.cgi: /pub/home/домен/cgi-bin/forum/data/boardstats.cgi did not return a true value at ikonboard.cgi line 85

кинь сюда эту строку. Если надо - еще строк до 85ой.

Цитата:
Ну допустим, довел программер-гений IB до совершенства. Но на сервере же он не один! Перегрузить серв могут другие пользователи. Эту причину, кстати, и назвал мне хостер полгода назад.

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

Цитата:
В любом случае, как бы не был перегружен сервер - не должно быть обнуления! Перезапись может не состояться, но файл должен остаться в прежнем, необновленном виде.

да с чего бы это?
файл открывается на перезапись, тут хлоп и не хватает ресурсов, процесс киляется - все, файл пустой теперь.
Автор: Marilda
Дата сообщения: 08.06.2003 20:06
Shurik

Цитата:
файл открывается на перезапись, тут хлоп и не хватает ресурсов, процесс киляется - все, файл пустой теперь

А да, временная резервная копия же не делается..

Окей, спасибо. Наверное, правда, ресурсов не хватает серверу. Попробую на хостеровом форуме поискать аналогичных страдальцев.
Автор: Shurik
Дата сообщения: 09.06.2003 08:26
Marilda
ты сверху фишку-то заюзай.
автоматический ребилд листа.
а также я на всякий случай постоянно автоматом делаю бэкап allforums.cgi
вообщем самые важные файлы...
Автор: Marilda
Дата сообщения: 10.06.2003 11:46
Shurik
Да я листы.цги и так восстанавливаю легким движением руки. На всякий случай: куда помещать sub recount?


Цитата:
постоянно автоматом делаю бэкап allforums.cgi

А как?


Автор: lynx
Дата сообщения: 10.06.2003 15:19
Marilda


Цитата:
куда помещать sub recount?


Помести в икон.либ, а вызывай &recount каждый раз при запросе list.cgi


Цитата:
$filetoopen = "$ikondir" . "forum$inforum/list.cgi";
if (-z $filetoopen) {
&recount;
}

Автор: Shurik
Дата сообщения: 10.06.2003 21:44
Marilda

Цитата:
Да я листы.цги и так восстанавливаю легким движением руки. На всякий случай: куда помещать sub recount?

lynx верно говорит.

Цитата:
А как?

посмотри, у тебя в checkboard.cgi че-нить с allforums.bak есть?
Автор: Marilda
Дата сообщения: 11.06.2003 00:24
lynx
Shurik
Спасибо.


Цитата:
посмотри, у тебя в checkboard.cgi че-нить с allforums.bak есть?

че-нить есть. Два вхождения, как в дефолтной.
Автор: olsufr
Дата сообщения: 18.11.2003 16:29
Предлагаю следующее решение против обнуления файлов *.thd
Причина в этом обнулении, на мой взгляд, состоит в удалении CGI-процесса сервером во время записи сообщений темы в файл.
Дело в том, что при открытии файла в режиме ">" его содержимое сразу же разрушается,
а новая информация еще не записана. И вот если процесс будет убит на этом этапе, то содержимое темы будет потеряно.
Предлагаю следующий код, в котором файлы *.thd открываются в режиме "+<".
Этот режим позволяет читать и записывать в файл без его первоначального разрушения.
Для этого режима файл должен уже существовать, что и имеет место быть при добавлении сообщения в уже существующую тему и при редактировании ранее написанного сообщения.


В файле post.cgi в подпрограмме sub addreply находите строки:
(Данные коррекции даны для файла post.cgi без хака склеивания постов,
если новый пост не позднее 2-х часов)


Код: # Grab the thread file

$filetoopen = "$ikondir" . "forum$inforum/$intopic.thd";
$filetoopen = &stripMETA($filetoopen);
open(FILE, "$filetoopen");
@allmessages = <FILE>;
close(FILE);
Автор: Marilda
Дата сообщения: 18.11.2003 20:57
olsufr
Надо будет попробовать, спасибо.
Автор: lynx
Дата сообщения: 03.12.2003 18:34
У кого-нибудь это получилось прикрутить?

У меня вечно пишет ошибку записи.

Вот этот код:


Цитата:

$last_message = "$inmembername|$topictitle|$postipaddress|$inshowemoticons|$inshowsignature|$currenttime|$inpost\n";
seek(FILETHD, -1, 2);
unless ( sysread(FILETHD,$last_char,1) ) { $output = ''; &error("$ibtxt{'1428'}&Ошибка вовремя записи сообщения"); }
if ($last_char ne "\n") { $last_message = "\n".$last_message; }
print FILETHD $last_message;
close(FILETHD);



Я правильно это читаю?

Пока (в переменную $last_char из файла топика *.thd не читается ни одного байта){
переменная $output пустая;
пишем ошибку;
}


В общем, что-то тут не так...
Автор: olsufr
Дата сообщения: 04.12.2003 09:25
lynx, читается этот код так:
1. Считывается последний символ (байт) из файла (в переменную $last_char из файла топика *.thd).

2. Если это считывание неудачно, т.е. если, например, файл поврежден или нет соответствующих прав, то выводится сообщение об ошибке. А т.к. к этому времени в переменной $output уже лежит сгенерированный код хорошей страницы, то сначала эта переменная опустошается, а потом дело передается в руки подпрограммы error, которая генерирует страницу с сообщением об ошибке.

3. Далее проверяется содержимое переменной $last_char и если оно не символ новой строки, в начало переменной $last_message добавляется символ новой строки (чтобы новое сообщение не слиплось с предыдущим, т.к. старый скрипт чего-то не считал нужным ставить завершающий символ новой строки в конце каждого последнего сообщения).

4. Ну а потом, идет запись переменной $last_message.

----------------------------

Странно, но у меня все работает хорошо:
и на локалке с Windows и на сервере на Linux.

Может быть дело в различиях разных видов окончания строки?
По определению функция sysread() возвращает число символов, которые удалось считать, или 0 - в конце файла, или undef - если произошла ошибка чтения.
Так вот, может в твоем случае возвращается 0?

Попробуй в работе (на локалке естественно и с темой, которую не жалко) такой фрагмент кода:
вместо seek(FILETHD, -1, 2); написать seek(FILETHD, -2, 2);

Код: $last_message = "$inmembername|$topictitle|$postipaddress|$inshowemoticons|$inshowsignature|$currenttime|$inpost\n";
seek(FILETHD, -1, 2);
unless ( sysread(FILETHD,$last_char,1) ) { $output = ''; &error("$ibtxt{'1428'}&Ошибка вовремя записи сообщения"); }
if ($last_char ne "\n") { $last_message = "\n".$last_message; }
print FILETHD $last_message;
close(FILETHD);
Автор: katja
Дата сообщения: 15.02.2005 12:36
У меня обнулились файлы .pl

Я изучила топик от начала до конца и немного запуталась...
Думаю, что мне помогут коды, написанные Shurik 14:11 08-06-2003

Объясните чайнику, в каком файле что на что меняется!!!
Автор: trew
Дата сообщения: 15.02.2005 19:08
katja Вот этот?:

Цитата:
Цитата:куда помещать sub recount?


Помести в икон.либ, а вызывай &recount каждый раз при запросе list.cgi


Цитата:$filetoopen = "$ikondir" . "forum$inforum/list.cgi";
if (-z $filetoopen) {
&recount;
}


Автор: katja
Дата сообщения: 15.02.2005 21:37
куда засунуть вызов, я нашла...
а вот куда саму процедуру Recount?
файла list.cgi у меня нет. я так понимаю, надо создать его с этой процедурой?
Автор: trew
Дата сообщения: 15.02.2005 21:42
katja В любое место в ikon.lib, можно перед

Код: 1;
Автор: katja
Дата сообщения: 15.02.2005 21:50
сделала.
но не работает пересчет сообщений в админцентре...

в какой момент должны "пересоздаваться" *.pl?
Автор: trew
Дата сообщения: 16.02.2005 01:44
katja

Цитата:
в какой момент должны "пересоздаваться" *.pl?
При добавлении сообщения в тему...
Еще при редактировании названия топика... Можно попробывать в названиях темы, где обнулились .pl , изменить наименование топика, например добавить точку к названию и посмотреть результат: востановится или нет.
Если, правда, топик открывается...
Автор: Marilda
Дата сообщения: 17.02.2005 15:42
katja
Не восстановит рекаунт pl-ки. Для восстановления pl где-то здесь был скрипт, протестченный и рабочий. Не могу найти, автор скрипта, по-моему, RQ. Топик был очень старый.
Юзать лучше на локалке, если будет надо, я расскажу, какие у него грабли.
Автор: trew
Дата сообщения: 17.02.2005 16:38
Marilda А я попробывал с редактированием топика и получилось.
Обнулил .pl и открыл топик на редактирование - инфа появилась в .pl. Единственное, что инфа есть, а размер все равно нулевой.
Автор: katja
Дата сообщения: 21.02.2005 11:45
trew
Я воспользовалась Вашим советом, и теперь при редактировании названия я имею НЕнулевой по размеру топик с таким содержанием:

137|название топика||||10||||

при появлении сообщения, топик заметно преобразуется:
137|название топика||open|8|10|||Lucia|1108057261

По-моему, у меня получилось, НО
В прошлом году у меня рухнула статистика.
Раз в три дня я делаю пересчет сообщений в админцентре, так как в активных разделах
число тем не соответствует действительности.
Сейчас эта функция недоступна. Как поступать в таком случае?


Marilda
Я тоже не нашла скрипт, о котором Вы пишете.
Если он старый, то его могли кинуть в архив, а это все равно, что искать иголку в стоге сена.
Автор: trew
Дата сообщения: 21.02.2005 14:13
katja

Цитата:
Сейчас эта функция недоступна.
она не доступна из админцентра или просто не правильно работает? То есть, если можно. то по-подробнее, пожалуйста....
Почему я спрашиваю, потому что у меня эта функция работает, но не правильно: вид работы есть, а подсчет не происходит...
Автор: katja
Дата сообщения: 21.02.2005 16:51
Когда раньше из админцентра я запускала пересчет сообщений в конкретном разделе, то получала отчет, что в этом разделе столько-то тем, столько-то сообщений. Как правило, после такого пересчета на 50-100 тем было меньше.
Сейчас, нажав на пересчет, получаю пустое правое окно.

Цитата:
эта функция работает, но не правильно: вид работы есть, а подсчет не происходит...
Как понять, "подсчет не происходит"?
Автор: trew
Дата сообщения: 21.02.2005 17:58
katja

Цитата:
Как понять, "подсчет не происходит"?
В форуме напрмер по счетчику 20 тем и 100 постов. но реально меньше. Когда нажимае пересчет, то процедура проходит нормально, и выводится отчет о тех же 20 тем и 100 постов...


Цитата:
Сейчас, нажав на пересчет, получаю пустое правое окно.
Где-то пропущена(лишняя) скобка или точка с запятой...
Это находится в setforums.cgi.
Хорошо бы сравнить функцию пересчета с дефолтной на предмет ошибки:
sub recount { и ниже всю функцию
А так же
Код: 'recount' => \&recount
Автор: katja
Дата сообщения: 09.03.2005 21:09
еще раз трезвым взглядом посмотрела:
при нажатии на "Пересчитать номера сообщений" переходит по адресу типа такого:
.../cgi-bin/ikonboard/setforums.cgi?action=recount&forum=12

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

не может это быть связано с тем, что и эта и свежевставленная функции называются recount-ом?

синтаксис проверила два раза: все правильно...

нехорошо без пересчета как-то жить...
и обнуленные *.pl не восстанавливаются, да и просто пересчетом иногда приходится пользоваться...
Автор: Marilda
Дата сообщения: 24.03.2005 13:02
Нашла у себя, кажется, тот самый скрипт (c) RQ. Помещаю, пока снова не потеряла.
Перед использованием, умоляю, потестите!


Код: #!/usr/bin/perl
use Fcntl ':flock';
use CGI qw(:standard);
require "ikon.lib";
require "data/progs.cgi";
require "data/boardinfo.cgi";
print header();
#21 поменяй на номер форума
rebuildLIST2(21);
sub rebuildLIST2 {
my ($forum) = @_;
opendir (DIR, "$ikondir" . "forum$forum");
my @entry = grep(/pl/, readdir(DIR));
closedir (DIR);
open (TMP, "$ikondir" . "forum$forum/list.cgi");
flock(TMP,LOCK_SH);
my @listf = <TMP>;
foreach (@listf){
chomp $_;
my ($topicids) = split (/\|/,$_);
$liststruct{$topicids} = [split (/\|/,$_)];
}
flock(TMP,LOCK_UN);
close (TMP);
undef @listf;
my @dat;
foreach my $lol (@entry){
my $rr;
my ($id) = split(/\./, $lol);
open (TMP, "$ikondir" . "forum$forum/$id.pl");
flock(TMP,LOCK_SH);

my ($topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split (/\|/,<TMP>);
flock(TMP,LOCK_UN);
close (TMP);

open (TMP, "$ikondir" . "forum$forum/$id.thd");
flock(TMP,LOCK_SH);
my @thds = <TMP>;
my ($startedby, $topictitle, undef, undef, undef, $startedpostdate) = split(/\|/,$thds[0]);
flock(TMP,LOCK_UN);
close (TMP);
next if (length(join('', @thds)) < 5 || $topictitle eq "");
$topicid = $topicid ne "" ? $topicid : $id;
$threadstate = $threadstate ne "" ? $threadstate : "open";
$threadposts = $threadposts ne "" ? $threadposts : $#thds;
$threadviews = $threadviews ne "" ? $threadviews : $#thds;
my ($lastposter, undef, undef, undef, undef, $lastpostdate) = split(/\|/,$thds[$#thds]);

$topicdescription =~ s/(:::(.*?)\b//;
open (FILE, ">$ikondir" . "forum$forum/$id.pl");
flock(FILE,LOCK_EX);
print FILE "$topicid|$topictitle|$topicdescription|$threadstate|$threadposts|$threadviews|$startedby|$startedpostdate|$lastposter|$lastpostdate";
flock(FILE,LOCK_UN);
close (FILE);
push (@dat, "$lastpostdate|$topicid|$topictitle|$topicdescription|$threadstate|$threadposts|$threadviews|$startedby|$startedpostdate|$lastposter");

}

my @sortdat = reverse(sort(@dat));
open (LIST, ">$ikondir" . "forum$forum/list.cgi");
flock(FILE,LOCK_EX);
foreach (@sortdat) {
chomp $_;
next if(! $_);
my ($lastpostdate, $topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter) = split (/\|/,$_);
print LIST "$topicid|$topictitle|$topicdescription|$threadstate|$threadposts|$threadviews|$startedby|$startedpostdate|$lastposter|$lastpostdate\n" if ($topictitle);
}
flock(FILE,LOCK_UN);
close (LIST);



}
Автор: Prosto_Alex1
Дата сообщения: 18.04.2005 08:34
нашелся на ikonboard.com вот такой скрипт:
http://forums.ikonboard.com/support/ikonboard.cgi?act=ST;f=74;t=12722;hl=pl+byte+script

#!/usr/bin/perl

use CGI::Carp "fatalsToBrowser"; # Output errors to browser
use CGI qw(:standard); # Saves loads of work
$|++; # Unbuffer the output
print header();

# Open and inspect each file *.thd in turn,
# take only files in the current directory.
for (glob "*.thd") {
print "$_\n";
next if ! m/(\d+).thd/;
my $topic_no = $1;
my $index_file = $topic_no . '.pl';
print " matches $index_file<br>";
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat ($index_file);
print " $index_file: $size bytes<p>";
rebuild_index ($topic_no, $_, $index_file) if $size == 0;
}

print "#### DONE! ####";


sub rebuild_index
{
my ($topic_no, $topic_file_name, $index_file_name) = @_;
die "No file names!" if !$topic_file_name or !index_file_name;
print " Rebuilding $index_file_name<br>";

# Read the topic file in one go; assume it's small enough not#
# to cause a memory famine. Put each line of the file in its
# own array element. From this, extract the first and last lines
# and count the number of lines. It is a fatal error for the
# file to have no lines.
open (TOPIC, $topic_file_name) or die "Can't open $topic_file_name: $!";
my @lines = <TOPIC>;
my $n_lines = scalar @lines;
die "No lines in $topic_file_name" if $n_lines < 1;
my $first_line = @lines[0];
my $last_line = @lines[$#lines];
close TOPIC;

# Parse the first line. The fields are delimited by '|' symbols and
# there are no newline characters embedded.
my ($first_poster, $title, $junk, $junk, $junk, $first_time, @junk) = split /\|/, $first_line;

# Parse the last line. Same rules as for the first line.
my ($last_poster, $junk, $junk, $junk, $junk, $last_time, @junk) = split /\|/, $last_line;
print " No. of lines: $n_lines<br> Title: $title<br> Topic Starter: $first_poster<br> Last Poster: $last_poster<br> Created: $first_time<br> Last Post: $last_time<br>";

# Format the line to go in the index file.
my $sub_title = '';
my $n_views = 0;
my $index = "$topic_no|$title|$sub_title|open|$n_lines|$n_views|$first_poster|$first_time|$last_poster|$last_time";
print " $index\n";

# Finally, restore the index file.
open (INDEX, ">$index_file_name") or die "Can't open $index_file_name: $!";
print INDEX $index;
close INDEX;
}

1;

с его помощью восстановились все .pl (кроме естественно убитых .thd)
так что временно вопрос снят...
кстати, буржуи на ikonboard.com пишут что не знаю-таки причину этого неприятного явления....
вроде как на 2.2 пытались вылечить, но по отзывам получилось не очень...

неужели переходить на 3.1????

Страницы: 12

Предыдущая тема: Максимальные нагрузки, которые может выдержать IB2.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.