从CGI脚本调用Mono时会挂起



我有一个用c#编写的程序,我需要从CGI脚本调用。

当我从python或bash CGI脚本调用程序时:

#!/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/plainnn'
p=subprocess.Popen(['/home/<user>/.mono/bin/mono','HelloWorld.exe'], stdout=subprocess.PIPE)
print p.stdout.read().strip('rn')

进程挂起,浏览器无限期等待响应。正如您所注意到的,我在我的主目录中"安装"了mono,因为我没有root权限。它是在服务器上编译的,可执行文件只是放在那个目录中,但它似乎在其他所有地方都工作得很好。

让人困惑的是:

  • 问题不会发生,如果我调用命令或确实cgi脚本自己eg。
  • 问题似乎发生在程序运行后:如果我将结果管道到文件,结果出现在文件文件中,mono似乎在完成后挂起。
  • 问题没有发生在我的mac笔记本电脑与相同的cgi脚本和。exe,但与mono正确安装。
  • 这个问题不会发生,如果脚本只是调用mono eg。(subprocess.Popen(['/home/<user>/.mono/bin/mono'], stdout=subprocess.PIPE)) - mono只是打印标准的"you've given me nothing to do"消息并正常退出。
  • 问题发生在任何。exe是否只是hello world或做一些相对复杂的计算,这是我的实际程序做的。

我已经尝试将MONO_SHARED_DIR设置为一个世界可写的目录,因为我最初认为这是与假根看到的问题相同的问题,请参阅Mono FAQ页面。

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++重写我的整个程序。

版本信息:

  • OS: Ubuntu 10.04.3 LTS
  • Mono: Mono JIT编译器版本2.10.2 (tarball Sat june 18 15:11:20 BST 2011)
  • Apache: Apache/2.2.14 (Ubuntu)

大多数人可能对答案不感兴趣,但为了完整起见,我应该提供它。

Retrosnub谁运行的服务器我正在使用有一个单独的web服务器和ssh服务器。我显然已经在ssh服务器上编译了mono,但是当我尝试从CGI脚本调用它时,它正在由web服务器执行。web服务器有一个不同的架构(32位而不是64位),这导致了所有的问题

最新更新