【问题标题】:Ghostscript crashes the serverGhostscript 使服务器崩溃
【发布时间】:2012-09-10 06:53:32
【问题描述】:

我的问题是:我正在使用 ghostscript 将一些 pdf 转换为 jpeg 文件,然后将它们渲染为 silverlight 控件。我正在使用以下方式转换 pdf 文件:

public void PdfToJpg(string ghostScriptPath, string input, string output) {
            timer1.Enabled = true;
            //if the pdf has more than 1 file (ex. 3) then 3 jpeg files will be outputed 
            String ars = "-dNOPAUSE -sDEVICE=jpeg  -r300 -o" + output + "-%d.jpeg  " + input;
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.Arguments = ars;
            startInfo.FileName = ghostScriptPath;
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;            
            using (Process exeProcess = Process.Start(startInfo)) {
                exeProcess.WaitForExit();
            }           
        }

然后将页码和页面字节[]保存到字典中,会话中的字典并使用启用silverlight的服务发送它,并将它们发送到包含silverlight控件的aspx页面(使用Response.redirect(page. ASP))。一切正常,但有时服务器(Cassini 或 IIS)崩溃,这意味着文件已转换但重定向从未发生,只是页面保持在加载状态。我必须使用“结束进程”关闭 cassini 或重新启动 IIS 服务器,以便该进程再次工作。我不认为问题出在服务上,因为我有一个类似的过程来向 silverlight 应用程序发送一个字节 [] 的音频文件并且一切正常,服务器永远不会卡住,所以我认为这是因为 ghostscript.. ., 如果有人有一些想法。另外我正在使用elmah并且没有报告错误......并且在调试时,当我单击包含转换和过程的其他部分的查看按钮时,它不会进入点击事件但转换完成(不是重定向),我不知道这怎么可能……谢谢。所以肯定是ghostscript的东西

更新: 我将代码更改为:

     using (Process convertProc = new Process()) {
                convertProc.StartInfo.FileName = ghostScriptPath;
                convertProc.StartInfo.Arguments = args;
                //convertProc.StartInfo.UseShellExecute = false;
                //convertProc.StartInfo.RedirectStandardOutput = true;
                convertProc.StartInfo.CreateNoWindow = true;
                convertProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                convertProc.Start();
                ThreadedKill(convertProc.Id);
                convertProc.PriorityClass = ProcessPriorityClass.Normal;
                convertProc.WaitForExit();
                }

如果 useshellexecute 和 redirectoutput 被注释了,服务器有时会变得“狂野”,如果没有,代码每次都运行完美,但是出现了 ghostscript 进程的窗口,我不希望这样。为了不出现,我必须评论这行或将 useshellexecute 设置为 true 并评论重定向输出,这有时会导致失败。我能做些什么?以及什么是redirectStandardOutput 以及它的作用...,在MSDN 上不明白...

更新 2: 将我的 gswin64.exe 更改为 gswin64c.exe 用于控制台应用程序,现在我正在谈论的那个窗口不再显示了。没有代码疯了……,至少现在还没有……

【问题讨论】:

  • 要解决这个问题,您可能需要提供有关错误的更具体信息,例如带有堆栈跟踪或至少是 Windows 错误代码的异常。事件日志中记录了什么?
  • 这就是问题所在,事件查看器中没有异常,没有错误,什么都没有..,在TaskManager中gswin64.exe在挂起时没有运行。
  • GPL Ghostscript 9.06 (2012-08-08) gswin64.exe

标签: c# asp.net iis-7.5 ghostscript cassini


【解决方案1】:

首先,您不需要-dNOPAUSE,因为-o 意味着-dBATCH-dNOPAUSE,但它并没有什么坏处。

此问题是否“间歇性”发生?或者,如果您发送的文件反复挂起(使服务器崩溃?):它是每次都挂起,还是更频繁地挂起该特定文件?

如果这确实是断断续续的,则不太可能是 Ghostscript。

要从 Ghostscript 捕获 stdoutstderr 到文件中,您可以添加 -sstdout=___.out-sstderr=___.err 以查看 Ghostscript 是否已抱怨。如果你总是写相同的文件,错误后的内容会告诉你是否有任何消息是由 gswin*.exe 产生的。

添加-Z: 也会在 Ghostscript 输出中添加一些时间信息。

请注意,由于您使用-r300 进行JPEG 输出:如果Ghostscript 意外停止,TEMP 目录中将有两个文件以te_ 开头并具有.tmp延期。这些是为基于磁盘的“clist”文件创建的,用于条带化(300 dpi 字母大小的页面足够大,可以超过默认的-dMaxBitmap=____ 值 8m)。

如果您在 TEMP 文件夹中没有看到 te_XXXXX.tmp 文件的堆积,那么 Ghostscript(可能)没有崩溃。

【讨论】:

  • TEMP 目录中没有 'te_'.tmp 文件...,我发送的文件无关紧要,当它挂起时,我发送的每个文件都不起作用,它正在转换为 jpeg 文件,但我在代码隐藏中的其余代码没有被执行。以及命令应该如何? :-sstdout=file.out -sstderr=file2.err -sDEVICE=jpeg -r300 -o" + output + "-%d.jpeg" + input;,.err 和 .out 文件应该在哪里?can\t在任何地方都可以找到它们,或者是因为 gs 不会产生错误?,现在我找到了一个根本没有被 gs 转换的 pdf 文件,我认为它应该显示一些日志或其他东西......,谢谢
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多