【问题标题】:Running linux shell command in background with '&' always fails使用“&”在后台运行 linux shell 命令总是失败
【发布时间】:2020-09-18 15:11:55
【问题描述】:

我正在尝试从 dot net core 运行 android 模拟器。我用这个代码来做:

    var psi = new ProcessStartInfo
    {
        FileName = "/Users/hexdump/Library/Android/sdk/platform-tools/adb",
        Arguments = "-avd emulator-5444 &",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
    };

    var proc = new Process
    {
        StartInfo = psi
    };

    
        
    success = proc.Start();
    proc.WaitForExit();
            

这里是非常标准的代码。这适用于我运行的所有命令,但是需要“分离”运行的命令不起作用。如果从控制台执行,显然它运行正常。

作为旁注,我已经删除了“WaitForExit”调用,并且不知何故我能够做我想做的事。但是,当我关闭 dotnet 时,我启动的进程也会被终止(显然)。而这不是我想要的。

dot net core 是否能够在后台运行脚本/可执行文件?

【问题讨论】:

  • 我已经超过 25 年没有看到这个问题了。不记得解决方法。在生成 shell 时,在 unix 中也会发生同样的事情。我认为这与标准输出有关。当您从命令窗口运行时,有一个标准输出所在的临时位置。你没有温度。 c# 进程中的环境变量为空。

标签: c# shell .net-core process


【解决方案1】:

& 是一个外壳结构。它说你想在后台运行应用程序。

但是您没有运行 shell(例如 bash)。你直接运行一个程序:/Users/hexdump/Library/Android/sdk/platform-tools/adb

要解决此问题,请从参数列表中删除参数 &。这使得 .NET Core 直接运行可执行文件。您还需要删除proc.WaitForExit() 调用,因为您的程序不想等待模拟器退出。


被误导的UseShellExecute 与在 Linux/macOS/Unix shell 中运行无关,它是 Windows shell。它的行为更像是调用 open (macOS) 或 xdg-open (Linux)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2019-11-10
    • 1970-01-01
    • 2021-05-11
    • 2022-01-18
    相关资源
    最近更新 更多