Currently there are actually three different ways for software to be started as a service in Ubuntu, SysV, Upstart and systemd. A service is defined here as a program run by the system in the background, as opposed to one started and run directly by the user.

SysV

The traditional way to start services in Linux was to place a script in /etc/init.d , and then use the update-rc.d command (or in RedHat based distros, chkconfig ) to enable or disable it.

This command uses some mildly complicated logic to create symlinks in /etc/rc#.d , that control the order of starting services. If you run ls /etc/rc2.d you can see the order that services will be killed with a file name like K##xxxx and started with file names S##xxxx . The ## in S##xxxx means a "start order" for service xxxx . Conversely, the ## in K##xxxx means the kill order for service xxxx .

One major issue with SysV was that when booting the system, everything had to be done in serial, one thing after another, making system boot times really slow. Attempts were made to parallelize this, but they were haphazard and hard to take full advantage of. This was the main reason that Upstart was created.

Upstart

Upstart uses job definition files in /etc/init to define on what events a service should be started. So, while the system is booting, upstart processes various events, and then can start multiple services in parallel. This allows them to fully utilize the resources of the system, for instance, by starting a disk-bound service up while another CPU-bound service runs, or while the network is waiting for a dynamic IP address to be assigned.

You can see all of the upstart job files by running ls /etc/init/*.conf

Let me just stop here and say that if you don't know what a service is, or what it does, DO NOT disable it!

Not all services have been converted to upstart. While working on the server team at Canonical for the past few months, I've worked on a number of converted job files, and the nicest part is that it allows one to get rid of all the script "magic" and just put in a few commands here and there to define exactly how to start the service, and nothing more. But for now, only a handful of traditional network services, like squid and samba, have been converted.

Is a service upstart-based?

In order to figure out if a service is upstart-based, you can run the status command:

status servicename

If it's an upstart job, it will show this:

$ status statd statd start/running, process 942

But if it's not, you'll see something more like this:

$ status apache2 status: Unknown job: apache2

In this case, apache2 has not been converted to upstart. So, to disable apache2 you just run

sudo update-rc.d apache2 disable sudo service apache2 stop

Disable services (jobs) in upstart

Upstart job definitions do not have an update-rc.d command. To disable the job, you need to edit the job file directly to disable it. There are two ways to do this.

If you want to still be able to manually start it, then you need to comment out the start on condition. Say you want to install samba, but not have it start automatically. Here is the job file (in natty):

description "SMB/CIFS File Server" author "Steve Langasek <steve.langasek@ubuntu.com>" start on local-filesystems stop on runlevel [!2345] respawn pre-start script RUN_MODE="daemons" [ -r /etc/default/samba ] && . /etc/default/samba [ "$RUN_MODE" = inetd ] && { stop; exit 0; } install -o root -g root -m 755 -d /var/run/samba end script exec smbd -F

To disable samba, you can just put a # in front of the " start on local-filesystems ". Note that while it won't start back up on boot, you still need to stop it this time with

sudo service smbd stop

If, however, you never want samba to start, I'd suggest actually removing the package. If, however, you want it installed, but not startable, you can also do:

mv /etc/init/smbd.conf /etc/init/smbd.conf.disabled

Disable a service using start/stop stanza (as of 11.04)

Starting with the version of upstart that will be in 11.04, there is a new keyword that disables the start on and stop on stanzas: manual . So another way to disable the service as of 11.04 is to do:

echo 'manual' | sudo tee /etc/init/mysql.override # command from root shell echo manual >> /etc/init/mysql.override