Сбой чтения файлов в папке scriptfiles
#21

Quote:

Только вот это не обязательно:

Я уже убрал это. Понял этот момент.

И вот тут в цикле немного поправил, вернее ZiGGi поправил:
old
PHP Code:
for (new 0strlen(str_fmt_log); i++)
{
    
fputchar(handlestr_fmt_log[i], false);

new
PHP Code:
for (new 0len strlen(str_fmt_log); leni++)
{
    
fputchar(handlestr_fmt_log[i], false);

Quote:

По крайней мере будет известно, сколько файлов открыто на момент возникновения проблемы. Даже если 0, то это тоже важный результат.

Попробую. Надо будет тогда ждать, пока опять сбой будет)

Quote:

Либо проблема в чем-то другом

Я отключал файлы по одному, оставил только лог и db базы геоип (базами db несколько лет пользовался и проблем не было). По сути в моде только лог работал - и всё равно произошёл этот сбой => я пришёл к выводу, что в нём проблемка)

Quote:

Как создаются папки под логи?

Я их вручную создал.
Reply
#22

stabker вообщем вчера случился очередной сбой, вот вырезка с клиентского лога:

[16:35:15] [join] Nickname has joined the server (...)
[16:35:15] Не удалось открыть файл 'bans/bans.ini'
[16:35:15] На данный момент открыто файлов: 0
[16:35:15] Не удалось создать/открыть файл лога 'log/2016/07/log_25.07.16.txt'
[16:35:17] На данный момент открыто файлов: 0

Во всех случаях написало, что 0 открыто.
На фоне этого сбоя я выявил, что даже файл samp.ban не работает (самповский бан).
Я забанил чувака и в samp.ban не записался бан. Это явно подозрительно, если даже самповский бан не открылся для записи.
После перезагрузки конечно всё работает, ну я же не буду постоянно перезагружать сервер. Как быть дальше?)
Reply
#23

Тогда не знаю. Если даже samp.ban не работает, то значит тут что-то другое.
Reply
#24

в чём проблема сделать автоматическую перезагрузку сервера раз в сутки (ночью, например?)
Reply
#25

Хотя нет, не факт, что тут что-то другое. Я проверил такой код

PHP Code:
new count;

while(
fopen("somefile.txt"io_write))
{
    
count++;
}
printf("Открыто максимальное количество файлов: %d"count);

SendRconCommand("banip 144.144.144.144"); 
т.е. открыл максимально возможное количество файлов, и в итоге айпишник тоже не забанился.

Quote:
Originally Posted by DartfoL
View Post
в чём проблема сделать автоматическую перезагрузку сервера раз в сутки (ночью, например?)
Кстати, это натолкнуло меня на одну мысль. Если у него рестарт через gmx, то код, который я давал, не сработает правильно, ведь после каждого рестарта массив будет очищаться, но файлы так и будут открыты.
Reply
#26

Если не решу проблему в ближайшее время, то буду вынужден поставить автоматическую перезагрузку сервера раз в сутки в 5 утра например.
Через gmx перезагружать опасно, ибо могут быть баги. У меня сервер может автоматом перезагружаться через exit и сам подниматься после перезагрузки.
Reply
#27

Quote:
Originally Posted by Diman777
View Post
Если не решу проблему в ближайшее время, то буду вынужден поставить автоматическую перезагрузку сервера раз в сутки в 5 утра например.
Через gmx перезагружать опасно, ибо могут быть баги. У меня сервер может автоматом перезагружаться через exit и сам подниматься после перезагрузки.
А щас он вообще не перезагружается?
Reply
#28

Сам нет, потому что зачем мне это - если мод мог без перезагрузок неделями работать (если нет обновлений).
А щас всё происходит так: сервер работает без перезагрузок дней 5 и случается сбой.
Reply
#29

Проблема актуальна. Всё тоже самое, но уже не 5-ом дне сбой, а на 2-ом (онлайн вырос и видимо что-то накапливается в быстром темпе, и как приходит предел - файлы не читаются).
Даже в клиентский бан-лист нельзя записать ип-адрес. Все файлы отрубились (банлист, базы SQL), за исключением клиентского лога server_log.txt. При этом сервер не падает, работает норм, игроки не жалуются.
Есть вариант - отключить серверный лог (его код я кидал выше) и посмотреть, что будет.
После перезагрузки (exit) - всё работает как обычно, но постоянно перезагружать мод бред.
Reply
#30

Quote:
Originally Posted by Diman777
View Post
Проблема актуальна. Всё тоже самое, но уже не на 5 дней сбой, а на 2-ом (онлайн вырос и видимо что-то накапливается в быстром темпе, и как приходит предел - файлы не читаются).
Даже в клиентский бан-лист нельзя записать ип-адрес. Все файлы отрубились (банлист, базы SQL), за исключением клиентского лога server_log.txt. При этом сервер не падает, работает норм, игроки не жалуются.
Есть вариант - отключить серверный лог (его код я кидал выше) и посмотреть, что будет.
После перезагрузки (exit) - всё работает как обычно, но постоянно перезагружать мод бред.
Возможно, проблема в том, что каждое открытие файла в сессии сервера, это n+1
new File:f=fopen("file.txt", io_read);
когда будет открытие под номером 4294967296/2+1 переменная нового открытия уйдет в минус, и все проверки на if(f) идут по бороде.
Хороший выход - сжечь нафиг файлы раз и навсегда.
Плохой выход - if(f!=0)
Reply
#31

Должен заметить, что if(f) не пойдет по бороде, если значение f будет меньше 0.
Reply
#32

Quote:

После перезагрузки (exit) - всё работает как обычно, но постоянно перезагружать мод бред.

вовсе не бред, тройка крупнейших проектов давно уже практикуют такое не просто так, а как раз из-за аналогичных аномальных багов после длительной работы сервера
Reply
#33

Повторно кину лог, который щас работает. Ничего особенного, казалось бы.
PHP Code:
// Макс. длина одной строки в логе (время + группа + текст)
const MAXLEN_STR_LOG 300;
new 
str_log[STRING_256];
#define Log(%1,%2,%3);\
    
{format(str_logSTRING_256, %2, %3);\
    
_Log(%1str_log);}
_Log(group[], text[])
{
    new 
daymonthyearhourminutesecond;
    
getdate(yearmonthday);
    
gettime(hourminutesecond);
    new 
name_log[STRING_64];
    
format
    
(
        
name_logSTRING_64,
        
"log/%d/%02d/log_%02d.%02d.%02d.txt",
        
yearmonthdaymonthyear-2000
    
);
    new 
File:handle fopen(name_logio_append);
    if (
handle)
    {
        new 
str_fmt_log[MAXLEN_STR_LOG];
        
format
        
(
            
str_fmt_logMAXLEN_STR_LOG"%02d.%02d.%02d %02d:%02d:%02d <%s> %s\r\n",
            
daymonthyear-2000hourminutesecondgrouptext
        
);
        for (new 
0len strlen(str_fmt_log); leni++)
        {
            
fputchar(handlestr_fmt_log[i], false);
        }
        
fclose(handle);
    }
    else
    {
        
printf ("Не удалось создать/открыть файл лога '%s'"name_log);
    }

Quote:
Originally Posted by eakwarp
View Post
когда будет открытие под номером 4294967296/2+1 переменная нового открытия уйдет в минус, и все проверки на if(f) идут по бороде.
В последний месяц лог набивает до 2.5мб в день, 1 день ~ 30.000 записей, 2 дня ~ 60.000, ну явно не 4294967296/2+1 открытий.

Quote:
Originally Posted by eakwarp
View Post
Хороший выход - сжечь нафиг файлы раз и навсегда
Да вот я поспорю, что лучше забыть про файлы, и юзать что-то другое. Реальный пример - Зная мод dimonml'а, так у него лог тоже на файлах, и набивал в лучшие времена до 50Мб (задумайтесь в эти цифры), и мод мог работать месяц без перезагрузки, это немыслимо.
Quote:
Originally Posted by DartfoL
View Post
вовсе не бред, тройка крупнейших проектов давно уже практикуют такое не просто так, а как раз из-за аналогичных аномальных багов после длительной работы сервера
Уже пол года спасаюсь перезагрузками. Хорошо, что хостер поддерживает возможность автоматом перезагружать сервак в указзаное мною время (делается exit и сам поднимается).
Reply
#34

Quote:
Originally Posted by DartfoL
View Post
вовсе не бред, тройка крупнейших проектов давно уже практикуют такое не просто так, а как раз из-за аналогичных аномальных багов после длительной работы сервера
Ничего аномального.
Reply
#35

Для логов рекомендую этот плагин: https://sampforum.blast.hk/showthread.php?tid=603175
Это лучше любого решения на Pawn.
Reply
#36

Логи на файлах - зло. Этим же не возможно потом пользоваться.
Reply
#37

Quote:
Originally Posted by eakwarp
View Post
Логи на файлах - зло. Этим же не возможно потом пользоваться.
Само-собой, но если кому-то надо, то пусть лучше делает это с тем плагином, там хотя бы сервер каждый раз не прерывается на запись.
Reply
#38

На счёт плагина посмотрим.
Щас провёл мини-тест со своим логом:
PHP Code:
for (new i1000000i++)
{
    
Log("тест""Тестирование лога i = %d"i);

Лог получился в 50Мб (2 минуты потребовалось), миллион строк и всё норм, после этого лог и др. файлы продолжили работу.
Вообщем надо тогда попробывать отключить серверный лог и наблюдать несколько дней, а может даже и недель)
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)