powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависает сервер при вызове UDF
19 сообщений из 19, страница 1 из 1
Зависает сервер при вызове UDF
    #39918290
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть функция, написанная на C, которая исполняет bash скрипт. Все работало нормально, пока не появилась необходимость вызывать из базы скрипт такого рода:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/bin/sh

URL=...

TITLE=`echo "$1" | iconv -f cp1251 -t utf-8`
MESSAGE=`echo "$2" | iconv -f cp1251 -t utf-8`
TOKEN=`echo "$3" | iconv -f cp1251 -t utf-8`

curl -d '{"title":"'"${TITLE}"'", "message":"'"${MESSAGE}"'","token":"'"${TOKEN}"'"}' -H "Content-Type: application/json" -X POST ${URL}


Причем, когда дергаю udf, скрипт отрабатывает, но вот fb виснет, приходится килять процесс. Версия FB 3.0.5 релиз, система Centos 7.
Есть у кого мысли в чем может быть дело?
Код функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
#include "gate4osc.h"
#include <sys/stat.h>
/*
 * Check if a file exist using stat() function
 * return 1 if the file exist otherwise return 0
 */
int cfileexists(const char* filename){
	
	int len = strlen(filename);
	char* fnameOnly = (char *)ib_util_malloc(len + 1);
	for(int i=0; i<=len; i++) {
		if(i == len) {
			fnameOnly[i] = '\0';
			break;
		}
		if(filename[i] == ' ') {
			fnameOnly[i] = '\0';
			break;
		}			
		fnameOnly[i] = filename[i];
	}
	
	
    struct stat buffer;
    int exist = stat(fnameOnly,&buffer);
	
    if(exist == 0)
        return 1;
	    
    return 0;
}

extern "C" char* EXPORT gate4osc(char *file_path_sh) {
	
  if(cfileexists(file_path_sh) == 0) {
	  return NULL;
  }	
	
  FILE *fp = popen(file_path_sh,"r"); 
  if (!fp) {
      //"Error exec command. File descriptor is null"
      return NULL;
  }
  
  char* buffer = (char *)ib_util_malloc(255);
  
  if (!buffer) {
	  //Can't alloc memory for buffer
	  return NULL;
  }
  
  buffer[0] = '\0';
  
  if(!feof(fp)) {
		fgets(buffer, 255, fp);
		int dataLen = strlen(buffer);
		buffer[dataLen] = '\0';
		//printf("Success read output data. Len: %d\n", dataLen);
  }
  
  pclose(fp);
  return buffer;
}


В прикрепленном файле стек потоков сервера.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918292
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
24.01.2020 11:41, demon1992 пишет:
>
> Есть функция, написанная на C, которая исполняет bash скрипт.
>

убыв бы!
ей бо!
(С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918304
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992,

не надо таких UDF писать, никогда
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918314
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992,

В cfileexists память за собой надо подчищать
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918322
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис

не надо таких UDF писать, никогда


А можно узнать почему?
Больше меня интересует вопрос как исправить проблему.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918328
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992,

Не надо использовать UDF для запуска скриптов. Это как минимум не безопасно.

demon1992Больше меня интересует вопрос как исправить проблему.

как обычно отладчиком. Для начала можно попробовать выполнить gate4osc в консольном приложении без сервера.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918387
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992 Все работало нормально
а что именно работало нормально?

я не знаю, можно ли запустить ФБ на Линуксе "как приложение", т.е. как fbserver -a (или firebird -a) как на Винде.
В этом случае можно понять - вдруг udf выдает что-то на экран, чего при работе службой или демоном ФБ выдать никак не может, и поэтому "виснет".
Кроме того, особенно на линуксе не надо забывать про права. скрипт выполняется ИЗ процесса ФБ, чего ему в этом случае разрешено, а чего нет - х.з.

А почему пишут "так не делать" - нельзя из сервера вызывать процессы, которые могут повиснуть, лезут куда-то по сетке, выполняют какие-то мутные операции, и т.д. Потому что это как раз и может привести к "сервер завис".
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918389
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё для рабочих процессов классика stdout это привязанный сокет ЕМНИП, поэтому любой
вывод из скрипта ломает протокол.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918486
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работала она, пока была написана на fp, но после перехода на ss начал падать сервак из-за многопоточного доступа.
Переписали на с, любой скрипт отрабатывает, который ничего не выводит, или выводит обычный текст.
А вот если вызывать в скрипте curl, то сам скрипт отрабатывает, но при этом сервер перестает отвечать. Если из терминала запустить скрипт, или даже скомпилить функцию как приложение, оно работает то все, но при этом какую-то фигню выводит, типо статистики сети или что-то типо того. Скорее всего fb и пытается показать это и не может. Как это поправить я чет не соображу никак.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918487
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

поэтому любой вывод из скрипта ломает протокол.

А про это можно подробнее?
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918492
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992А про это можно подробнее?

Нет. Тут программист нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39918495
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992
но после перехода на ss начал падать сервак из-за многопоточного доступа

То есть, причина падения - не кривые руки, а многопоточность.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39919118
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
demon1992
но после перехода на ss начал падать сервак из-за многопоточного доступа

То есть, причина падения - не кривые руки, а многопоточность.
Самое интересное - не в этом.
А в том, что "из-за многопоточного доступа" начало зависать потому, что "было написано на fp", и в связи с этим пришлось переписать на c, на котором, как известно, не должно зависать "из-за многопоточного доступа", в отличие от написанного на fp.
Вот такую логику увидел мой шар.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39919147
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

видимо, на fp был очень сложный код, который на c удалось переписать только с вызовом внешнего скрипта.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39919173
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

ничего удивительного. Как только надо сделать чуть более сложное чем 2+2 люди начинают искать готовые компоненты (наследники TComponent). Это добро в UDF работает мягко говоря не очень. А на C это ещё надо уметь писать.

demon1992,

сарказмПопробуй на C++ переписать в виде UDR. Авось заработает
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39919338
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
kdv,

ничего удивительного. Как только надо сделать чуть более сложное чем 2+2 люди начинают искать готовые компоненты (наследники TComponent). Это добро в UDF работает мягко говоря не очень. А на C это ещё надо уметь писать.

Не обязательно. Все могло быть банально - отсутствовала установка IsMultiThread

По сабжу - если задача просто отправить json, то корректнее всего применять отдельную службу. Как компромиссный вариант - пусть и запускать скрипт, но не блокировать. Отработает и ладно.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39920941
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992
Если из терминала запустить скрипт, или даже скомпилить функцию как приложение, оно работает то все, но при этом какую-то фигню выводит, типо статистики сети или что-то типо того. Скорее всего fb и пытается показать это и не может. Как это поправить я чет не соображу никак.

Тама есть ключик -s или --silent он как раз эту "какую-то фигню" отключает.
Кроме того, утилита на старте читает конфиг и дефолтными параметрами.
Возможно они несколько различаются при выполнении из консоли и из под FB.

Ну и вообще-то popen форкает сервер.
Я как-то даже теряюсь хорошо ли это для SS со всеми его общими ресурсами.
Но тут только старшие товарищи помочь могут.

А по хорошему - действительно такое на отдельном сервисе делать нужно.
Заведи табличку и пиши тудыть команды.
Сервис будет её вычитывать, команды исполнять и результаты рядом складывать.
Ну, или что более навороченное, типа RabbitMQ подобных можно прикрутить. :)
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39920947
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tonal,
Спасибо. :)
Я согласен с этим конечно, но как это обычно бывает, понаписали изначально такую логику вызова через udf, и не парился никто что это выйдет когда - то боком, вот и приходится с костылями работать.
Но мне вообще интересен сам факт того, как поправить эту проблему, если это можно сделать конечно.
...
Рейтинг: 0 / 0
Зависает сервер при вызове UDF
    #39920990
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992
Но мне вообще интересен сам факт того, как поправить эту проблему

уже озвучивали, вынести это из БД
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависает сервер при вызове UDF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]