运行过程中单声道崩溃
我想构建一个视频转换队列,因此运行单声道程序的服务器从队列中提取视频并运行ffmpeg将其转换。当运行许多ffmpeg进程时,单声道给我错误。运行过程中单声道崩溃
所以我用ping创建了一个测试用例,因为它是一个长时间运行的作为ffmpeg的测试用例。
static TextWriter tw = new StreamWriter("error.txt");
private static int _started;
public static void Main (string[] args)
{
for (int i=0; i<1000; i++) {
Start ("ping", "localhost");
}
Console.WriteLine("Memory: " + (GC.GetTotalMemory(true)/1024) + "KB");
Console.WriteLine(_started);
tw.Flush();
Console.ReadLine();
}
public static Process Start (string name, string args)
{
try {
var proc = new ProcessStartInfo {
FileName = name,
Arguments = args,
RedirectStandardOutput = true,
CreateNoWindow = false,
RedirectStandardError = false,
UseShellExecute = false,
RedirectStandardInput = false,
};
Process.Start (proc);
_started++;
} catch (Exception ex) {
tw.WriteLine (ex.InnerException+Environment.NewLine+ex.Message + Environment.NewLine + ex.StackTrace, false);
tw.Flush();
}
return null;
}
和运行时,相同的错误的情况下抛出的有关ffmpeg
ApplicationName='ping', CommandLine='localhost', CurrentDirectory=''
at System.Diagnostics.Process.Start_noshell
(System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process
process) [0x00000] in <filename unknown>:0
at System.Diagnostics.Process.Start_common
(System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process
process) [0x00000] in <filename unknown>:0
at System.Diagnostics.Process.Start (System.Diagnostics.ProcessStartInfo
startInfo) [0x00000] in <filename unknown>:0
at test1.MainClass.Start (System.String name, System.String args) [0x00000]
in <filename unknown>:0
和
的CreateProcess:错误创建进程处理
所以这是我的环境:
Mono JIT compiler version 2.10.8.1 (Debian 2.10.8.1-5ubuntu1)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: altstack
Notifications: epoll
Architecture: amd64
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: Included Boehm (with typed GC and Parallel Mark)
和极限值
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31439
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31439
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我想继续我的项目,但我不能因为这个异常,1年的工作与单后,我真的很喜欢它,不想学其他语言因为这个麻烦。
我希望有一个与我的代码,而不是单声道运行时出现问题。
所以我的临时解决方案:
public static void Start (string cmd, int time)
{
new Thread (p =>
{
try {
Mono.Unix.Native.Syscall.system (String.Format("timeout {0} {1}", time, cmd));
} catch (Exception ex) {
//log it
}
}
).Start();
}
必须调用WaitForExit和处置流程实例。
所以,你开始的方法将是这个样子:
public static void Start (string name, string args)
{
new Thread (() =>
{
try {
var proc = new ProcessStartInfo {
FileName = name,
Arguments = args,
RedirectStandardOutput = true,
CreateNoWindow = false,
RedirectStandardError = false,
UseShellExecute = false,
RedirectStandardInput = false,
};
using (var p = new Process()) {
p.StartInfo = proc;
p.Start();
p.WaitForExit();
}
_started++;
} catch (Exception ex) {
tw.WriteLine (ex.InnerException+Environment.NewLine+ex.Message + Environment.NewLine + ex.StackTrace, false);
tw.Flush();
}
}).Start();
}
你能测试这个吗?在我的电脑上它不起作用,同样的错误出现。 – croisharp 2013-02-21 17:04:12
@croisharp:对不起,我忘了你需要等待Linux上的进程。看到我更新的答案。 – 2013-02-21 23:37:43
那么它类似于什么[错误报告告诉你这样做(https://bugzilla.novell.com/show_bug.cgi?id=536776#c4)(而且可能更好 - 用'WaitForExit'通话),但启动一个线程,然后等待每个进程运行一段不确定时间的进程似乎有点容易出错。 – 2013-02-21 23:43:37
原谅我的题外话的问题,而是你如何控制限值?我在控制堆栈大小特别感兴趣:http://stackoverflow.com/questions/14263148/mono-regex-and-stack-size – IneQuation 2013-02-20 18:23:58
https://bugzilla.novell.com/show_bug.cgi?id=536776 #C4 – 2013-02-21 13:59:08
即_started ++应该[Interlocked.Increment](https://msdn.microsoft.com/en-us/library/dd78zt0c(v = VS.110)的.aspx),否则这将是不准确的带螺纹。 – 2015-07-28 15:47:31