Выполнение shelljs застревает на DigitalOcean - PullRequest
0 голосов
/ 29 марта 2019

У меня есть React веб-приложение, размещенное на DigitalOcean (Ubuntu 16.04). В приложении имеется скрипт R на сервере (node), который вызывается shelljs (команда shCMD вызывает скрипт R. Он никогда не попадает внутрь обратного вызова exec):

exec_full_analysis = shell.exec(shCMD, function(code, stdout, stderr) {
 if (code === 0) {
      console.log('Program output:', stdout);

      pdfService.drawChartsPDF(typeArr, analysisId, datasetArr, pairArr, filterArr);

      console.log('sendStatus 200')

      res.sendStatus(200);
    } else {
      console.log('Program stderr:', stderr);
      //res.sendStatus(500);
    }
  });

Я использую foreverjs для запуска сервера. Он работает в среде conda. Итак, когда скрипт запускается изначально, я вижу правильный вывод журнала (скрипт R выполняется), который foreverjs предоставляет мне, но очень быстро вывод журнала прекращается. Никаких ошибок ни в браузере, ни в логе forever нет. Сервер достигает определенной стадии в моем скрипте R и как-то застревает. Есть ли способ выяснить, что происходит не так? Чтобы вы посоветовали? Локально все работает просто отлично. Единственное, что может отличаться, это conda окружение, но я ожидаю, что оно выдаст ошибку, но ее нет.

Обновление

Я посмотрел /var/log/syslog, но не вижу OOM ошибок: https://www.digitalocean.com/community/questions/python-script-gets-killed

Обновление

Это не проблема с foreverjs: выполнение простого node server.js застревает в том же месте в R скрипте.

Скрипт застревает в Seurat - функция пакета ScaleData:

 seurat_object <- ScaleData(object = seurat_object, vars.to.regress = c("nUMI"))

со следующим выводом:

ScaleData работает с ненормализованными значениями. Рекомендуемый рабочий процесс - сначала запустить NormalizeData. Отступление: NUMI | | 0%

Но, конечно, локально все работает хорошо. А на сервере он застревает во второй итерации for -loop, поэтому один раз он просто отлично работает на сервере, но во второй раз происходит сбой, как будто есть ограниченное время для запуска процесса, установленного на DigitalOcean .

Обновление

Сервер был apache2. Я переключился на nginx, и теперь сервер работает нормально, он не застревает, и проблема почти решена, за исключением того, что теперь я получаю 504 ошибки тайм-аута шлюза.

1 Ответ

0 голосов
/ 29 марта 2019

Итак, я не знаю почему, но это была apache2 проблема с сервером. Я переключился на nginx, но затем появились RAM ошибки нехватки памяти, которые я исправил, уменьшив объем памяти, используемый моим R сценарием:

options(java.parameters = "-Xmx6000m")

Это было -Xmx8000m. Затем скрипт корректно завершал работу на сервере, но на клиенте я увидел 504 ошибки тайм-аута шлюза, которые я исправил с помощью решения, найденного здесь: https://asdqwe.net/blog/solutions-504-gateway-timeout-nginx/

Только что созданный файл в /etc/nginx/conf.d/timeout.conf с:

proxy_connect_timeout       3000;
proxy_send_timeout          3000;
proxy_read_timeout          3000;
send_timeout                3000;

После чего он наконец заработал

...