How to supervise and automatically restart a process?
This answer applies to Ubuntu versions with Upstart (<= 14.10). Use another approach for versions with Systemd (>= 15.04).
It seems you're looking for a functionality already provided in Ubuntu with Upstart. The respawn
stanza in the configuration will do exactly what you need. I would recommend against the use of a less standard way of dealing with this.
Without more details about the process you're trying to manage with it, it's hard to say what the configuration should look like. It depends on whether it forks and puts itself in the background for example. The Upstart documentation on the respawn
stanza should give you more information.
Unfortunately, it's not yet possible to run User Jobs properly: cannot get upstart to run user job
Example
Let's assume we want to keep the Calculator app running, even when it's being killed with fire (signal 9).
Create a configuration file in
/etc/init/calculator.conf
(based on this article):#!upstart description "Calculator" # Start job via the daemon control script. Replace "gert" with your username. exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator' # Restart the process if it dies with a signal # or exit code not given by the 'normal exit' stanza. respawn # Give up if restart occurs 10 times in 90 seconds. respawn limit 10 90
Start it by running
sudo start calculator
It opens on your current display (
:0
) and enjoy the awesomeness by seeing it restarting after closing it.Identify the process ID, e.g. by doing
ps aux | grep calculator
:gert 13695 0.2 0.4 349744 16460 ? Sl 13:38 0:00 /usr/bin/gnome-calculator
Kill it with fire.
sudo kill -9 13695
Watch it reappearing:
gert 16059 4.6 0.4 349736 16448 ? Sl 13:40 0:00 /usr/bin/gnome-calculator
Note that this will be more elegant with the plans for the Ubuntu 13.04 plans with proper User Job support.
An extremely simple tool that can accomplish the same effect without needing configuration is immortal
: https://immortal.run/
Simply execute the command like this:
immortal <cmd>
It will run in the background and restart automatically if it exits.
immortalctl
: View the status of running jobs. There is aname
column which will be printed here, you can use this to refer to the job with other control commands.immortalctl stop <name>
: Stops monitoring the job with the given name (it will not be automatically restarted, but the current process will continue to execute)immortalctl -k <name>
: Sends SIGKILL to the current process.immortalctl exit <name>
: Stops monitoring the job with the given name and removes it from the list of jobs.