23

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.

Filnor
  • 1,290
  • 2
  • 23
  • 28
Jamie Rees
  • 7,973
  • 2
  • 45
  • 83
  • 1
    It's a self contained deployment – Jamie Rees Dec 13 '17 at 12:03
  • 3
    If anyone needs help with this the last answer from this post helped me https://stackoverflow.com/questions/45132081/file-permissions-on-linux-unix-with-net-core/47918132#47918132 – Yitzak Hernandez May 24 '19 at 15:11
  • Your .NET code looks fine. I would start by testing your code with some known built-in tool like "/bin/ping google.com" to confirm that the issue relates to ACLs. Also, check that all parent directories higher in the tree for Ombi. The updater has executive permissions. You may look for more information in [Unix & Linux](https://unix.stackexchange.com/) and [Ask Ubuntu](https://askubuntu.com/) StackExchange sites. – Vitaliy Shibaev Jul 07 '20 at 03:22
  • Maybe upload a tarball of it? – kettle Mar 22 '21 at 04:31
  • Did you check your SELinux or whatever-you-have on your distribution? Shut it down just for a test and see if it'll work. – NewRK Jun 03 '21 at 19:01

2 Answers2

1

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();
}
Haldun
  • 56
  • 3
0

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.

JBSnorro
  • 6,048
  • 3
  • 41
  • 62
  • After the `chmod` command I could execute the file manually, but still not through `Process.Start`. I tried investigating using `strace`, although it didn't help , and eventually gave up. You can see strace output here: https://github.com/JeroenBos/JBSnorro.LayoutEngine/issues/17 – JBSnorro Aug 15 '21 at 11:49