How does the operating system know which parameter to pass to /etc/init.d/ ?

I've been working with linux for a while but in a rather simple manner.

I understand that scripts in init.d are executed when the os starts but how exactly does it works?

How does the os know which paramater to pass to a script?

To start apache I would do sudo /etc/init.d/apache2 start. If I run sudo /etc/init.d/apache2 it doesn't work without the start. How does the os pass start to the script?


Depending on your Linux distro and release, ultimately sysvinit scripts (those scripts in /etc/init.d/) are generally run from the symlinks which exist in /etc/rc[0-6S].d, by /etc/init.d/rc.

Under Ubuntu, you're either using old-style sysvinit, or more recently, upstart. Under the upstart management directory (/etc/events.d/) you'll find a legacy mode that falls back to the /etc/init.d/rc invocation. Otherwise, /etc/init.d/rc is invoked for each runlevel via /etc/inittab.

If you examine the logic of /etc/init.d/rc, you'll find it defines actions depending on runlevel (0 & S are unconditionally stopped) or script prefix (S[0-9][0-9]* scripts start, K[0-9][0-9]* (kill) scripts stop). The numbering of scripts within a runlevel directory (e.g.: /etc/rc1.d/) determines the order in which scripts are stopped or started. Kill scripts are run first, then start scripts.

For more on this, research sysvinit and upstart.


I suggest you read some tutorial on how runlevels and init scripts work - http://www.debian-administration.org/article/212/An_introduction_to_run-levels seems quite understandable.

In short, the scripts are not called directly, but through symlinks in the /etc/rc.d directories, where n = runlevel. The symlink's names are formatted like this:

[K | S] + nn + [string] 

where nn is a number marking the order in which the scripts are run (lower numbers first) and K or S determines whether to run the script with the "stop" or "start" parameter.