← All posts

Init Scripts for FreeBSD and Debian/Ubuntu

Every daemon needs a control script to start it, stop it, and so on. But an init script is not always included. Today I’ll explain how to write a basic init script for the two main systems I work with: FreeBSD and Debian/Ubuntu. We’ll use the svnserve daemon as an example, and I’ll run everything as the www user.

Example Script for FreeBSD

Let’s create the file /usr/local/etc/rc.d/svnserve


touch /usr/local/etc/rc.d/svnserve
chmod +x /usr/local/etc/rc.d/svnserve

This init script comes from the subversion port


#!/bin/sh

# PROVIDE: svnserve
# REQUIRE: DAEMON
# KEYWORD: shutdown

# Каждый rc.d должен "включать" в себя файл /etc/rc.subr (здесь для этого используется команда ".")
# перед тем как он вызовет функцию rc.subr(8). Наиболее предпочтительный вариант - сделать это перед
# любыми другими действиями.
. /etc/rc.subr

# Определяем параметры по умолчанию, вы можете указать инные в /etc/rc.conf, об этом чуть ниже
svnserve_enable=${svnserve_enable:-"NO"}
svnserve_flags=${svnserve_flags:-"-d --listen-port=3690 --listen-host 0.0.0.0"}
svnserve_data=${svnserve_data:-"/var/svn/repos"}
svnserve_user=${svnserve_user:-"www"}
svnserve_group=${svnserve_group:-"www"}

name=svnserve
rcvar=`set_rcvar`
load_rc_config $name
command=/usr/local/bin/svnserve.bin
command_args="-r ${svnserve_data}"

# $1 - это первый аргумент коммандной строки
# Например, если вы ввели "svnserve start", то $1 будет "start".
run_rc_command "$1"

To start it automatically when the system boots, add the following to /etc/rc.conf:


svnserve_enable="YES"

You can also specify parameters in /etc/rc.conf to override the defaults


svnserver_user="www"
svnserver_group="www"
svnserver_data="/var/svn/repos"

You can read more about init scripts in the official FreeBSD documentation:

Example Script for Debian/Ubuntu

Let’s create the script file and a PID file (to store our daemon’s PID)


touch /etc/init.d/svnserve && chmod +x /etc/init.d/svnserve
touch /var/run/svnserve.pid && chown www:www /var/run/svnserve.pid

Now let’s write the script itself, which we can run using the service command or simply by running the script and passing it parameters


#!/bin/sh

# параметры для запуска
svnserve_flags="-d --listen-port=3690 --listen-host 0.0.0.0 --log-file /var/log/svnserve.log --config-file /var/svn/svnserve.conf"

# храним путь до pid-файла, он нам понадобится для остановки демона
svnserve_pid_file="/var/run/svnserve.pid"

# путь до репозитория
svnserve_data="/var/svn/repos"

# пользователь от которого будем запускать демона
svnserve_user="www"

# путь до демона
command="/usr/local/bin/svnserve"

# аргументы для демона
command_args="-r ${svnserve_data}"

# команда start
start()
{
    # от имени пользователя www запускаем svnserve
    su $svnserve_user -c "$command $svnserve_flags --pid-file $svnserve_pid_file $command_args"
    echo "Svnserve start"
}

# команда stop
stop()
{
    # киляем svnserve
    su $svnserve_user -c "kill -9 `cat $svnserve_pid_file`"
    echo "Svnserve stop"
}

# команда restart, которая просто останавливает, ожидает 1 секунду и снова запускает демона
restart()
{
    stop
    sleep 1
    start
}

# теперь опишем при каких условиях запускать наши ф-ии
case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    reload|restart)
        restart
    ;;
    *)
        # по умолчанию выводим небольшой help по испольщованию скрипта
        echo "Usage: {start|stop|restart}"
        exit 1
    ;;
esac

exit 0

An example of starting the daemon


service svnserve start
/etc/init.d/svnserve start

To start it automatically when the system boots, run


update-rc.d svnserve defaults

To remove it from system startup, run


update-rc.d svnserve remove

or simply remove its execute permissions (chmod -x /etc/init.d/svnserve)

Summary

There we are—we’ve learned how to write basic init scripts. You won’t have to write one every time, since a daemon usually comes with an init script. If you install it through a package management system, the script will automatically be installed in “/etc/rc.d/” or “/usr/local/etc/rc.d/” on FreeBSD, and in “/etc/init.d/” on Debian/Ubuntu.

It’s also customary to include comments in init scripts, for example like this for Debian. But to be honest, I don’t write them; they’re more necessary when an init script is included in a distribution, and don’t matter for my own use.

To enable automatic startup on Red Hat, you need to:


sudo /sbin/chkconfig <service> on
sudo /sbin/chkconfig --list <service>

Comments are closed. Read the original discussion in Russian →