【问题标题】:Start.Process() .net Core doesn't work in Linux DockerStart.Process() .net Core 在 Linux Docker 中不起作用
【发布时间】:2023-04-01 09:45:01
【问题描述】:

我创建了一个带有 ASP.net 核心服务的 docker 容器。但是,该服务应该在 docker 容器内启动另一个服务。我现在面临的问题是 Process.Start() 在这个 Linux 容器中似乎不起作用。

这是我迄今为止尝试过的:

            Process process;
            ProcessStartInfo processInfo;

            string fileName = "bin/bash dotnet run /root/SubService/SubService.API.dll";
            string arguments = $"Company --urls http://localhost:5000/SolutionName";
            string escapedArguments  = $"-c /{arguments}/";

            processInfo = new ProcessStartInfo(escapedFilename, escapedArguments)
            {
                CreateNoWindow = true,
                UseShellExecute = false,
                WindowStyle = ProcessWindowStyle.Hidden,
                RedirectStandardError = false,
                RedirectStandardOutput = false
            };

            try
            {
                process = Process.Start(processInfo);
                process.WaitForExit();
                process.Close();
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }

当 Process.Start(processInfo) 被调用时,我得到异常“没有这样的文件或目录”。但是,路径是正确的。 可能是什么问题呢?或者是否有另一种方法可以从 asp.net 核心服务启动进程。

谢谢。

【问题讨论】:

  • 该文件名参数肯定有问题。尝试运行其他命令提示符或记事本,看看它是否与文件名参数有关或与 c# 程序的其余部分有关。那么如果是关于文件名,我们可以弄清楚。
  • 我也尝试过 UseShellExecute,但不幸的是,这并没有帮助。我很确定文件名参数是正确的。你怎么不这么认为@ÖzgürGüzeldereli?
  • 好吧,可能没有错,抱歉。我想到了别的东西。您可以尝试使用 Process.start 运行 bash 以外的其他东西吗?除了你想要的命令之外的任何东西。例如一个文本编辑器,但具有相同的 startInfo。如果您可以使用 process.start 打开其他内容,那么问题出在文件名/路径/参数
  • 会尝试,但可能需要一些时间。谢谢!
  • 好的没问题慢慢来。完成后,将此处的输出或结果写给我,我会看看接下来我们能做什么。顺便说一句,您的代码不包括正在定义的转义文件名。

标签: docker asp.net-core


【解决方案1】:

经过更多测试,问题似乎是 Process.Start() 方法的使用不正确。这次使用了参数。

它是这样工作的:

            Process process;
            string outputStream;
            string errorStream;

            try
            {
                string fileName = "dotnet";
                string arguments = $"{subServiceData.ApplicationPath} {subServiceData.SolutionName} --urls { subServiceData.SubServiceUrl}";
                process = Process.Start(fileName, arguments);
                process.WaitForExit();

                // *** Read the streams ***
                outputStream = process.StandardOutput.ReadToEnd();
                errorStream = process.StandardError.ReadToEnd();

                int exitCode = process.ExitCode;
                process.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2019-07-22
    • 2022-08-24
    • 2022-08-09
    • 2019-04-19
    • 2022-08-17
    相关资源
    最近更新 更多