Mono Process.Start 返回 ExitCode 255?

3

我有一个简单的C# Mono 2.10应用程序在CentOS 5.5上运行,调用

Process.Start("/path/to/myapp/myapp.exe","-someArgs");    

我可以获取进程ID并运行。
mono --trace=N:System.Diagnostics

显示了一个堆栈,似乎表明Process.Start返回了true:

LEAVE: System.Diagnostics.Process:Start_noshell (System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process)TRUE:1
LEAVE: System.Diagnostics.Process:Start_common (System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process)TRUE:1
LEAVE: System.Diagnostics.Process:Start ()TRUE:1
LEAVE: (wrapper remoting-invoke-with-check) System.Diagnostics.Process:Start ()TRUE:1

我猜这意味着该进程在未发生异常(例如FileNotFound等)的情况下被生成。
然而,进程似乎立即退出,并且我得到的退出代码是255。我认为这是一个带有一些明显含义的Linux退出代码,但我在网络上找不到任何有用的信息。
当直接启动完全相同的应用程序时,...
mono /path/to/myapp/myapp.exe -someArgs 

应用程序没有任何异常地启动,并按预期工作。

有什么线索是我搞砸了什么吗?

4个回答

4
文件/path/to/myapp/myapp.exe是否为可执行文件(chmod +x /path/to/myapp/myapp.exe)?Mono 2.10会检查启动的进程是否为托管可执行文件,如果是,则隐式使用当前执行的mono来启动新进程,例如Mono的CreateProcess源代码CreateProcess包含所有细节,其中包括: 如果Process.Start仍然无法启动您的进程,则可能是mono的bug,我们希望能为其报告一个bug。 :-)

好的,你赢了,用新答案给出了明确的解释。如果我在我的可执行文件上运行ls -l命令,权限应该是这样的-rwxr-xr-x。 - Brad Cunningham
即使我强制对myexe执行chmod +x(它已经是可执行的),它仍然无法启动我的进程。那么这是mono的一个bug吗? - Brad Cunningham

2
尝试将"mono"作为进程启动,并使用"/path/to/myapp/myapp.exe -someArgs"作为命令行参数。这将使Process.Start的行为更像您正常的应用程序启动。

我考虑尝试一下那个let。让我看看会发生什么。 - Brad Cunningham
太棒了,问题解决了。我启动的“应用程序”是“mono”,而不是“myapp.exe”,这很有道理,谢谢。 - Brad Cunningham
1
这应该是不必要的,因为mono的CreateProcess()明确检查托管可执行文件并隐式使用相同的mono来启动它们。"/path/to/myapp/myapp.exe"可执行吗(chmod +x)?另请参见:https://github.com/mono/mono/blob/master/mono/io-layer/processes.c#L812 - jonp

2
问题在于Linux本身不知道需要使用Mono来运行CIL .exe二进制文件,因此它尝试使用ld-linux.so作为加载器,导致明显的失败。您需要使用/path/to/myapp.exe作为参数调用mono。
顺带一提,退出代码255只是“错误”。

我发现255是无用的,谢谢提供信息。Reed比你早几分钟回答了,但两个答案都是正确的。谢谢。 - Brad Cunningham

0
您可以使用 Process.Start 的重载来启动进程:
Process.Start("/bin/bash", "-c \"echo 'Hello World!'\"");

不知道为什么,但它有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接