.Net Core Process.Start on Linux



我在Linux上运行.NET Core应用程序时面临以下问题。

这是例外:

System.ComponentModel.Win32Exception (0x80004005): Permission denied
   at Interop.Sys.ForkAndExecProcess(String filename, String[] argv, String[] envp, String cwd, Boolean redirectStdin, Boolean redirectStdout, Boolean redirectStderr, Int32& lpChildPid, Int32& stdinFd, Int32& stdoutFd, Int32& stderrFd)
   at System.Diagnostics.Process.StartCore(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at Ombi.Schedule.Jobs.Ombi.OmbiAutomaticUpdater.<Update>d__18.MoveNext() in C:projectsrequestplexsrcOmbi.ScheduleJobsOmbiOmbiAutomaticUpdater.cs:line 218

这是代码:

var updaterFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),
     "TempUpdate", $"Ombi.Updater");
var start = new ProcessStartInfo
{
    UseShellExecute = false,
    CreateNoWindow = true,
    FileName = updaterFile,
    Arguments = GetArgs(settings), // This just gets some command line arguments for the app i am attempting to launch
    WorkingDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "TempUpdate"),
};
using (var proc = new Process { StartInfo = start })
{
    proc.Start();
}

我们调用.Start()时似乎正在抛出例外。

我不确定为什么会发生这种情况,文件和文件夹上的权限已设置为777。

几年后,我遇到了相同的错误,不喜欢为此做出.dll的方法。而是将文件名设置为" dotnet"并传递DLL路径作为第一个参数将解决问题。

var updaterFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),
     "TempUpdate", $"Ombi.Updater");
var start = new ProcessStartInfo
{
    UseShellExecute = false,
    CreateNoWindow = true,
    FileName = "dotnet", // dotnet as executable
    Arguments = updaterFile + " " +GetArgs(settings),  // first argument as dll filepath
    WorkingDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "TempUpdate"),
};
using (var proc = new Process { StartInfo = start })
{
    proc.Start();
}

一个好的诊断工具是查看是否可以直接从shell执行文件(如果您在Windows上,则在WSL中)。

从Windows的角度来看,很容易忘记您需要将可执行文件标记为Linux上的可执行文件。如果您无法自己执行,则chmod 775 /your/file可能会有所帮助。

最新更新