从CGI脚本调用Mono时会挂起

时间:2011-09-16 09:28:40

标签: c# bash mono cross-platform cgi

我有一个用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/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会话。
  • 程序运行后似乎出现了问题:如果我将结果传输到文件中,结果显示在文件文件中,单声道似乎在完成后就会挂起。
  • 使用相同的cgi脚本和.exe但在正确安装了mono的Mac笔记本电脑上不会出现此问题。
  • 如果脚本只调用mono,则不会出现问题。 (subprocess.Popen(['/home/<user>/.mono/bin/mono'], stdout=subprocess.PIPE)) - mono只打印出标准的“你给我无事可做”的信息并正常退出。
  • 任何.exe都会出现问题,无论是hello world还是进行一些相对复杂的计算,这都是我的实际程序所做的。

我已经尝试将MONO_SHARED_DIR设置为一个世界可写的目录,因为我原先认为这与使用伪root看到the Mono FAQ page时出现的问题相同。

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 :(得分:0)

对大多数人来说,答案可能并不有趣,但为了完整起见,我应该提供。

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