Linux: How to write a System V init script to start, stop, and restart my own application or service

Posted on in Categories Linux, RedHat/Fedora Linux, Shell scripting, Tips last updated September 19, 2006

System V (abbreviated as SysV) is most widely used across most Linux distributions. But what is System V?

Init is the program on Unix and Linux systems which spawns all other processes. It runs as a daemon and typically has PID 1. It is the parent of all processes. Its primary role is to create processes from a script stored in the file /etc/inittab file. The main advantages is flexibility and scalability provided by SysV.

The Runlevels in System V describe certain states. For example:

  • Runlevel 0: Halt
  • Runlevel 1: Single user mode
  • Runlevel 6: Reboot

All System V init scripts are stored in /etc/rc.d/init.d/ or /etc/init.d directory. These scripts are used to control system startup and shutdown. Usually you will find scripts to start a web server or networking. For example you type the command:
# /etc/init.d/httpd start
# /etc/init.d/network restart
In above example httpd or network are System V scripts written in bash or sh shell. Here is a sample shell script:

# chkconfig: 35 90 12
# description: Foo server

# Get function from functions library
. /etc/init.d/functions

# Start the service FOO
start() {
        initlog -c "echo -n Starting FOO server: "
        /path/to/FOO &
        ### Create the lock file ###
        touch /var/lock/subsys/FOO
        success $"FOO server startup"

# Restart the service FOO
stop() {
        initlog -c "echo -n Stopping FOO server: "
        killproc FOO
        ### Now, delete the lock file ###
        rm -f /var/lock/subsys/FOO
### main logic ###
case "$1" in
        status FOO
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
exit 0

Above script is specific to Cent OS or Fedora Core/Red Hat Linux. But it should work on all other Linux distro as well. Make sure you replace the FOO name (word/path start with FOO) with actual application name.

18 comment

  1. Don’t forget to highlight the description and chkconfig comments at the top, they’re what the chkconfig utility uses to figure out what run levels to start/stop the script in. It’s not necessary for the script to work, but if the comments are in there they should be right!


  2. Hello, I have a problem and would like some real help. I believe it deals with the topic just discussed. At this point, I’m not sure of the questions I’m supposed to be asking. Here’s my problem: I’m about to start programming some “multiplayer” games for the blind. The games will be text-based games (no heavy load graphics). I am going to write my game interface using my ‘visual studio 2005’ software in c++. All the players will have a copy of my game interface on their computers. The game interface will send each player’s move or ‘turn decision’ to a ‘constantly’ running script, which will be ‘listening’ for clients on the Internet. The script will then send the ‘move’ to all the other players of the game so everyone has the same instance of the game at the same time. I have never done this before. I am just extrapolating on what I like to call the ‘logical progression flow’. I have a domain ( with the host4profit website hosting service. They have two files in my root directory: ‘.bash_profile’ and ‘.bashrc’. I know these two files have something to do with the ‘bash’ shell. I was also told I would need to create a ‘deamon bash script’ if I wanted a script that would continuously ‘listen’ on the Internet for clients in order to process their moves. My question is this: Am I on the write track, and how do I create a ‘safe’ deamon script that will not make my host provider nervous?

  3. This is script is an example to start or stop daemon or service. You are coding in C/C++ and you need to write daemon using same language until and unless you are writing API for perl or php.

  4. Is a daemon simply a program that I write in ‘bash’ and is always running on my host’s server and it simply calls my pearl script that does all the ‘ios::socket’ listening? I’m not sure what a daemon is and how to create one. Please explain or give me a link to a text file explaining the daemon file. P.S. Should this be a new topic? If so, where should I post it. I would need to post the original message.

  5. When I use the script for a test daemon, get the following error for line:45 which the echo statement below. Am I missing something?

    echo $”Usage: $0 {start|stop|restart|reload|status}”

    ./testd: line 45: restart: command not found
    –cmd and –run are incompatible with –string or –name
    ./testd: line 45: reload: command not found
    ./testd: line 45: status}”: command not found

  6. Inquisitive,

    If you cut and past this example, it may have inserted the wrong ” characters. Simply replace the double quotes in your copy and it should work.

  7. I would be interested to know if and how the game for the blind was written.

    For those who are used to J2EE, Apache modules, .NET and all those other technologies, something that does netcat | sed … | netcat might be a refreshing change.

  8. I get :
    [[email protected] init.d]# service myserviced start
    env: /etc/init.d/myserviced: No such file or directory

    the file does exists and its executable.

    chkconfig myserviced on
    went without complaining? any tips?

    I’m on Centos 5.5.

  9. I will use this script to restart mysql service , so I will change the following :
    /path/to/FOO & –> to be /retrovue/home/mysql
    retrovue ( user )
    touch /var/lock/subsys/FOO –> to be touch /var/lock/subsys/mysql
    killproc FOO —-> to be killproc mysql
    rm -f /var/lock/subsys/FOO –> rm -f /var/lock/subsys/mysql

    is it correct ?

    How I can make this Script run daily at 01:00 AM

    I wait your reply ASAP

  10. I haven’t used mysql for a few years, but it should have a System V service script of its own, or use upstart or whatever replaces System V services on your machine.

    You have to specify what operating system, version etc.

    Note also that the above script probably won’t work on Debian based systems as there is no /etc/init.d/functions – and you have to do all those things the slow way.

    Both Fedora and Ubuntu have moved on to Upstart (and I believe Fedora have something even newer), so the System V service scripts become an emulation.

    With System V you would use a command like:
    service restart mysql

    With Upstart this becomes something like:
    restart mysql

    To do this daily at 01:00 you would have to edit your root user’s crontab, and place the commands there – like

    sudo crontab -e

    ..and place a line in the file like:

    00 01 * * * restart mysql

    But then I have questions for you (to think about):
    How long have you been using Unix/Linux?
    If this is a production server – do you need expert advice, rather than doing it on your own?
    Why is there a need to restart a database server every night?

    Especially the last question. I can’t imagine that recent releases of MySQL have memory leaks or other problems. I leave database servers running for months at a time with no problems.
    Maybe the problem is rather that you have long running queries that you don’t control?

  11. Hi,

    Does this work by placing in the /etc/init.d or do we have to link them to rc3.d and rc0.d. if so… can you please let me know the detailed steps as well…


  12. Hi,

    Do we need to link these to rc3.d and rc0.d . If so, please let me know the detailed procedure apart from placing this script in /etc.init.d/

    Also please let me know how to check if the service is stopped before the server is down.


  13. Once again, I do’t know what operating system etc., so it’s difficult to answer.

    Both Debian/Ubuntu and Fedora/Redhat/CentOS have ‘chkconfig’ scripts that set up the System V style links. If the init.d script is written correctly (with comments indicating the runlevels required), it is enough to do ‘chkconfig myservice on’.

    (chkconfig might not be installed by default on Ubuntu, use apt-get…)

    If the scripts are written correctly, then the ‘stop’ is invoked before system shutdown (which means – transition to runlevel 0).

Leave a Comment