This question is not strictly programming related, but for sure important for programmers.
I wrote a simple smtp server, when I run it from console all is fine, except it is blocking the command line.
I know I can run it via
nohup ... &
As Nick mentioned Supervisord is a great option that has also worked well in my experience.
Nick mentioned problems with forking- forking itself works fine AFAICT. The issue is not forking but dropping privileges. Due to the way the Go runtime starts the thread pool that goroutines are multiplexed over (when GOMAXPROX > 1), the setuid systemcall is not a reliable way to drop permissions.
Instead, you should run your program as a non-privileged user and use the setcap utility to grant it the needed permissions.
For example, to allow binding to a low port number (like 80) run will need to run setcap once on the executable:
sudo setcap 'cap_net_bind_service=+ep' /opt/yourGoBinary
You may need to install setcap:
sudo aptitude install libcap2-bin