What is "run it in the background" means? Do you run a console program but don't want it output stdout/stderr on the terminal? Or do you want to run a GUI program but dont want it show window?
How do you send something to the child process? Using Command line argument? Pipe? socket? environment variable? file? or other thing?
Do you need to run some code while a child process running? If so, startProcess is an only proc that returns before a spawned process ends. All other procs that spawn a process blocks until it ends. Using blocking procs might bad idea if you run a program that can freeze because they don't have timeout parameter. If you use waitForExit proc with some timeout parameter, your program can avoid freezing even if child process freezed.
If you want to spawn a process with a string as argument and it can contains any charactors, procs that takes arguments as array (startProcess, execProcess) would be better than a procs that takes command and all arguments as a string (execCmd, execCmdEx). If they takes arguments as array, you don't need to care about how to quote a string. If execCmd called with a path that contains spaces and it was not quoted, a child process would takes it as multiple parameters and it doesn't work as you expected.
You can look here for an example in my halonium project.
It currently will block until the webdriver process is connectable, but you'd have to find a way to determine that in your own code based on the executable. I'm assuming that if it's a long running process, there must be some way to communicate with it.
After that, I call spawn service.watchOutput() which you could use as an example for logging. You'll have to read around a little in the file I linked, but all of the process handling stuff is in there, including argument passing.
I use the latter for my tester in httpbeast: https://github.com/dom96/httpbeast/blob/master/tests/tester.nim