'C# execute a terminal command in linux

I want my c# application (which I execute on a raspberry pi) to run a bash script whenever it starts..
basically : the script is located in /etc/init.d and is named mnw. I want whenever my c# application starts, it should execute a part of the mnw script.
If it was written it in the terminal would look like :

cd /etc/init.d
./mnw stop

I want this to happen right at the start of public static void Main(), I've been trying

ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/dev/init.d/./mnw", Arguments = "stop", }; 
Process proc = new Process() { StartInfo = startInfo, };
proc.Start();

but it says that stop is a unexpected argument, any ideas?



Solution 1:[1]

I have never used ProcessStartInfo on Mono / Linux, but have you tried calling via bash?

ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/bin/bash", Arguments = "/dev/init.d/mnw stop", }; 
Process proc = new Process() { StartInfo = startInfo, };
proc.Start();

Also, there is no issues with the executable bit on mnw?

Solution 2:[2]

While using the Process class like in the accepted answer works, I' d like to add that there is a library called CliWrap that makes CLI calls like this much easier:

  • fluent API to build the calls
  • async support
  • call with custom environment variables
  • set working directory
  • ability to pipe stdout/stderr into a string
  • retrieve exit code
  • etc.

using OPs question as example:

var result = await Cli
                  .Wrap("/dev/init.d/mnw")
                  .WithArguments("stop")
                  .ExecuteBufferedAsync();

// result contains:
// -- result.StandardOutput  (string)
// -- result.StandardError   (string)
// -- result.ExitCode        (int)
// -- result.StartTime       (DateTimeOffset)
// -- result.ExitTime        (DateTimeOffset)
// -- result.RunTime         (TimeSpan)

if (result.ExitCode != 0)
    Console.WriteLine("Command failed")

Thank you @Tyrrrz for this library!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 flindeberg
Solution 2 3dGrabber