Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависает сервер при вызове UDF / 19 сообщений из 19, страница 1 из 1
24.01.2020, 11:41
    #39918290
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает сервер при вызове UDF
Добрый день.
Есть функция, написанная на 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
24.01.2020, 11:45
    #39918292
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает сервер при вызове UDF
24.01.2020 11:41, demon1992 пишет:
>
> Есть функция, написанная на C, которая исполняет bash скрипт.
>

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

demon1992,

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

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

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

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

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

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

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

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


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