How do I get my Golang web server to run in the background?
LinuxShellDaemonLinux Problem Overview
I have recently completed the Wiki web development tutorial (http://golang.org/doc/articles/wiki/). I had tons of fun and I would like to experiment more with the net/http package.
However, I noticed that when I run the wiki from a console, the wiki takes over the console. If I close the console terminal or stop the process with CTRL+Z then the server stops.
How can I get the server to run in the background? I think the term for that is running in a daemon.
I'm running this on Ubuntu 12.04. Thanks for any help.
Linux Solutions
Solution 1 - Linux
Simple / Usable things first
If you want a start script without much effort, you could use the upstart
service. See the corresponding manual page and /etc/init/*.conf
for examples. After creating such a process
you can start your server by calling
service myserver start
If you want more features, like specific limitations or permission management, you could try xinetd
.
Using the shell
You could start your process like this:
nohup ./myexecutable &
The &
tells the shell to start the command in the background, keeping it in the job list.
On some shells, the job is killed if the parent shell exits using the HANGUP signal.
To prevent this, you can launch your command using the nohup
command, which discards the HANGUP signal.
However, this does not work, if the called process reconnects the HANGUP signal.
To be really sure, you need to remove the process from the shell's joblist. For two well known shells this can be achieved as follows:
bash:
./myexecutable &
disown <pid>
zsh:
./myexecutable &!
Killing your background job
Normally, the shell prints the PID of the process, which then can be killed using the kill
command, to stop the server. If your shell does not print the PID, you can get it using
echo $!
directly after execution. This prints the PID of the forked process.
Solution 2 - Linux
You could use Supervisord to manage your process.
Solution 3 - Linux
Ubuntu? Use upstart
.
Create a file in /etc/init
for your job, named your-service-name.conf
start on net-device-up
exec /path/to/file --option
You can use start your-service-name
, as well as: stop
, restart
, status
Solution 4 - Linux
This will configure your service using systemd
, not a comprehensive tutorial but rather a quick jump-start of how this can be set up.
Content of your app.service
file
[Unit]
Description=deploy-webhook service
After=network.target
[Service]
ExecStart=/usr/bin/go webhook.go
WorkingDirectory=/etc/deploy-webhook
User=app-svc
Group=app-svc
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=deploy-webhook-service
PrivateTmp=true
Environment=APP_PARAM_1=ParamA
Environment=APP_PARAM_2=ParamB
[Install]
WantedBy=multi-user.target
Starting the Service
sudo systemctl start deploy-webhook.service
Service Status
sudo systemctl status deploy-webhook.service
Logs
journalctl -u deploy-webhook -e
Solution 5 - Linux
After you press ctrl+z (putting the current task to sleep) you can run the command bg
in the terminal (stands for background) to let the latest task continue running in the background.
When you need to, run fg
to get back to the task.
To get the same result, you can add to your command &
at the end to start it in the background.
Solution 6 - Linux
To add to Greg's answer:
To run the Go App as a service you need to create a new service unit file.
However, the App needs to know where Go is installed. The easiest way to lookup that location is by running this command:
which go
which gives you an output like this:
/usr/local/go/bin/go
With this piece of information, you can create the systemd service file. Create a file named providus-app.service
in the /etc/systemd/system/
using the command below:
sudo touch /etc/systemd/system/providus-app.service
Next open the newly created file:
sudo nano /etc/systemd/system/providus-app.service
Paste the following configuration into your service file:
[Unit]
Description=Providus App Service
After=network.target
[Service]
Type=forking
User=deploy
Group=deploy
ExecStart=/usr/local/go/bin/go run main.go
WorkingDirectory=/home/deploy/providus-app
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=providus-app-service
PrivateTmp=true
[Install]
WantedBy=multi-user.target
When you are finished, save and close the file.
Next, reload the systemd daemon so that it knows about our service file:
sudo systemctl daemon-reload
Start the Providus App service by typing:
sudo systemctl restart providus-app
Double-check that it started without errors by typing:
sudo systemctl status providus-app
And then enable the Providus App service file so that Providus App automatically starts at boot, that is, it can start on its own whenever the server restarts:
sudo systemctl enable providus-app
This creates a multi-user.target
symlink in /etc/systemd/system/multi-user.target.wants/providus-app.service
for the /etc/systemd/system/providus-app.service
file that you created.
To check logs:
sudo journalctl -u providus-app