Mono зависает при вызове из CGI-скрипта - PullRequest
2 голосов
/ 16 сентября 2011

У меня есть программа, написанная на C #, которую мне нужно вызывать из CGI-скрипта.

Когда я вызываю программу из CGI-скрипта на python или bash:

#!/bin/bash
echo Content-type: text/plain
echo
echo    
/home/<user>/.mono/bin/mono HelloWorld.exe

или

#!/usr/bin/python

import subprocess

print 'Content-type: text/plain\n\n'
p=subprocess.Popen(['/home/<user>/.mono/bin/mono','HelloWorld.exe'], stdout=subprocess.PIPE)
print p.stdout.read().strip('\r\n')

процесс зависает, и браузер ждет ответа в течение неопределенного времени.Как вы могли заметить, у меня есть «моно», установленный в моем домашнем каталоге, поскольку у меня нет привилегий root.Он был скомпилирован на сервере, и исполняемый файл просто находится в этом каталоге, но, похоже, он отлично работает для всего остального.

Что сбивает с толку:

  • Проблема не возникает, если я вызываю команду или действительно скрипт cgi, например.из сеанса SSH.
  • Кажется, что проблема возникает после запуска программы: если я перенаправлю результаты в файл, результаты появятся в файле, моно просто зависнет после его завершения.
  • Проблема не возникает на моем ноутбуке Mac с тем же сценарием cgi и .exe, но с правильно установленным моно.
  • Проблема не возникает, если скрипт просто вызывает моно, например.(subprocess.Popen(['/home/<user>/.mono/bin/mono'], stdout=subprocess.PIPE)) - mono просто печатает стандартное сообщение «Вы мне ничего не дали» и нормально завершает работу.
  • Проблема возникает с любым .exe, будь то просто hello world или создание какого-то относительно сложноговычисления, что и делает моя настоящая программа.

Я пытался установить MONO_SHARED_DIR в каталог, доступный для записи во всем мире, как я изначально думал, что это та же проблема, что и в fake-rootсм. страницу с часто задаваемыми вопросами Mono .

gdb дает следующий вывод:

Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /lib/libnss_compat.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/libnss_compat.so.2
Reading symbols from /lib/libnsl.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/libnss_nis.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/libnss_nis.so.2
Reading symbols from /lib/libnss_files.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/libnss_files.so.2
0x00007f85d7680b50 in sem_wait () from /lib/libpthread.so.0

Я погуглил последнюю строку и sem_wait, но я могу 'Я не нахожу ничего значимого, так как это, кажется, общая проблема.

Любая помощь по этой проблеме была бы очень признательна, я действительно не хочу переписывать всю мою программу на C ++ из C #.

Информация о версии:

  • ОС: Ubuntu 10.04.3 LTS
  • Mono: Mono JIT-компилятор версии 2.10.2 (tarball Sat Jun 18 15:11:20 BST 2011)
  • Apache: Apache / 2.2.14 (Ubuntu)

1 Ответ

0 голосов
/ 08 мая 2013

Ответ, вероятно, не интересен большинству людей, но для полноты я должен предоставить его.

Retrosnub, который запускает сервер, который я использовал, имеет отдельный веб-сервер и ssh-сервер. Я, очевидно, скомпилировал mono на сервере ssh, но когда я попытался вызвать его из CGI-скрипта, он выполнялся веб-сервером. Веб-сервер имеет другую архитектуру (32-битную, а не 64-битную), которая вызвала все проблемы.

...