Jamie Rees
Jamie Rees

Reputation: 8183

.Net Core Process.Start on Linux

I am facing the following issue when running my .Net Core application on Linux.

Here is the exception:

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:\projects\requestplex\src\Ombi.Schedule\Jobs\Ombi\OmbiAutomaticUpdater.cs:line 218

Here is the code:

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();
}

It seems that the exception is being thrown when we call .Start().

I am not sure why this is happening, the permissions on the file and folders have been set to 777.

Upvotes: 24

Views: 7499

Answers (2)

JBSnorro
JBSnorro

Reputation: 6706

A good diagnostic tool is to see if you can execute the file directly from the shell (in WSL if you're on Windows).

From a Windows perspective it's easy to forget that you need to mark your executables as executable on linux. If you can't execute it yourself, chmod 775 /your/file may help.

Upvotes: 0

Haldun
Haldun

Reputation: 56

After years, I ran into same error and did not like approach of making .dll executable for this. Instead setting FileName to "dotnet" and passing dll path as first argument will do the trick.

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();
}

Upvotes: 1

Related Questions