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 →