mirror of
https://github.com/troglobit/finit.git
synced 2026-09-30 13:02:37 +07:00
Reference sections kept pointing at the line-based format they no longer
document. `sysv` and `task` sent the reader to Services for "<COND>",
the cgroups chapter opened by listing three legacy directives and then
explained further down that only two of them exist here, and the logging
chapter still gave "log:prio:facility.level,tag:ident" as the full
syntax.
Some claims were wrong independent of the format:
- a sysv is a supervised daemon, grouped with service in
SVC_TYPE_DAEMON, not a variation on task
- restart-max has no upper bound of 255, or any other
- the built-in rescue fallback runs in 12345789, not 12345
- conditional loading quotes system/10-hotplug.conf, not
system/hotplug.conf
- the key spells conflicts, not conflict
- the built-in getty no longer wants TERM last, it is a key
`if` takes either a service name or, in angle brackets, a condition,
decided in svc_ifthen(). Only the examples showed this, so it is now
said.
Terminology follows the split index.md already draws: a block is the new
format, a stanza the line-based one.
src/rescue.conf was still line-based, missed because it sits in src/
rather than system/ or contrib/.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
215 lines
6.8 KiB
Markdown
215 lines
6.8 KiB
Markdown
Configuration Example
|
|
=====================
|
|
|
|
This example `/etc/finit.conf` can also be split up in multiple `.conf`
|
|
files in `/etc/finit.d`. Available, but not yet enabled, services can
|
|
be placed in `/etc/finit.d/available` and enabled by an operator using
|
|
the [initctl](initctl.md) tool.
|
|
|
|
See the [contrib/][contrib] directory on GitHub for examples, or take a
|
|
peek at systems using Finit, like [Infix OS][infix] and [myLinux][].
|
|
|
|
> [!TIP]
|
|
> A block spans as many lines as it needs, so no continuation character is
|
|
> called for. For the full syntax, see the [finit.conf(5)][] manual or the
|
|
> [Configuration](config/index.md) section.
|
|
|
|
```ApacheConf
|
|
# Fallback if /etc/hostname is missing
|
|
hostname = "default"
|
|
|
|
# Runlevel to start after bootstrap, 'S', default: 2
|
|
#runlevel = 2
|
|
|
|
# Global environment variables, be careful though with variables like
|
|
# PATH, SHELL, LOGNAME, etc.
|
|
#environment {
|
|
# PATH = "/usr/bin:/bin:/usr/sbin:/sbin"
|
|
#}
|
|
|
|
# Max file size for each log file: 100 kiB, rotate max 4 copies:
|
|
# log => log.1 => log.2.gz => log.3.gz => log.4.gz
|
|
log {
|
|
size = 100k
|
|
count = 4
|
|
}
|
|
|
|
# Services to be monitored and respawned as needed
|
|
service watchdog {
|
|
description = "System watchdog daemon"
|
|
runlevel = "S12345"
|
|
envfile = "-/etc/conf.d/watchdog"
|
|
command = "watchdog $WATCHDOG_OPTS $WATCHDOG_DEV"
|
|
}
|
|
service syslogd {
|
|
description = "System log daemon"
|
|
runlevel = "S12345"
|
|
envfile = "-/etc/conf.d/syslog"
|
|
command = "syslogd -n $SYSLOGD_OPTS"
|
|
}
|
|
service klogd {
|
|
description = "Kernel log daemon"
|
|
runlevel = "S12345"
|
|
conditions = { "pid/syslogd" }
|
|
envfile = "-/etc/conf.d/klogd"
|
|
command = "klogd -n $KLOGD_OPTS"
|
|
}
|
|
service lldpd {
|
|
description = "LLDP daemon (IEEE 802.1ab)"
|
|
runlevel = "2345"
|
|
envfile = "-/etc/conf.d/lldpd"
|
|
command = "lldpd -d $LLDPD_OPTS"
|
|
}
|
|
|
|
# The BusyBox ntpd does not use syslog when running in the foreground
|
|
# So we use this trick to redirect stdout/stderr to a log file. The
|
|
# log file is rotated with the above settings. The condition declares
|
|
# a dependency on a system default route (gateway) to be set. ntpd
|
|
# does not respect SIGHUP, so Finit restarts it on reload instead.
|
|
service ntpd {
|
|
description = "NTP daemon"
|
|
runlevel = "2345"
|
|
conditions = { "net/route/default" }
|
|
reload-signal = "none"
|
|
log { file = "/var/log/ntpd.log" }
|
|
command = "ntpd -n -l -I eth0"
|
|
}
|
|
|
|
# For multiple instances of the same service, add :ID to the block title.
|
|
service merecat:80 {
|
|
description = "Web server"
|
|
runlevel = "2345"
|
|
command = "merecat -n -p 80 /var/www"
|
|
}
|
|
service merecat:8080 {
|
|
description = "Old web server"
|
|
runlevel = "2345"
|
|
command = "merecat -n -p 8080 /var/www"
|
|
}
|
|
|
|
# Alternative method instead of below runparts, can also use /etc/rc.local
|
|
#sysv keyboard-setup {
|
|
# description = "Setting up preliminary keymap"
|
|
# runlevel = "S"
|
|
# command = "/etc/init.d/keyboard-setup"
|
|
#}
|
|
|
|
# Hidden from boot progress, using an empty description
|
|
#sysv acpid {
|
|
# description = ""
|
|
# runlevel = "S"
|
|
# command = "/etc/init.d/acpid"
|
|
#}
|
|
|
|
# Run start scripts from this directory
|
|
#runparts = "/etc/start.d"
|
|
|
|
# Virtual consoles run BusyBox getty, keep kernel default speed
|
|
tty tty1 {
|
|
runlevel = "12345"
|
|
command = "/sbin/getty -L 0 /dev/tty1 linux"
|
|
nowait = true
|
|
noclear = true
|
|
}
|
|
tty tty2 {
|
|
runlevel = "2345"
|
|
command = "/sbin/getty -L 0 /dev/tty2 linux"
|
|
nowait = true
|
|
noclear = true
|
|
}
|
|
tty tty3 {
|
|
runlevel = "2345"
|
|
command = "/sbin/getty -L 0 /dev/tty3 linux"
|
|
nowait = true
|
|
noclear = true
|
|
}
|
|
|
|
# Use built-in getty for serial port and USB serial
|
|
#tty ttyAMA0 { runlevel = "12345" device = "/dev/ttyAMA0" noclear = true nowait = true }
|
|
#tty ttyUSB0 { runlevel = "12345" device = "/dev/ttyUSB0" noclear = true }
|
|
|
|
# Just give me a shell, I need to debug this embedded system!
|
|
#tty console { runlevel = "12345" device = "@console" noclear = true nologin = true }
|
|
```
|
|
|
|
The `service` block, as well as `task`, `run` and others are described in
|
|
full in the [Services Syntax](config/services.md) section.
|
|
|
|
Here's a quick overview of some of the most common components needed to start
|
|
a UNIX daemon:
|
|
|
|
```
|
|
service NAME { <-- Supervised program (daemon)
|
|
description = "Example daemon" <-- Optional description
|
|
runlevel = "2345" <-- Optional runlevels
|
|
conditions = { "net/route/default" } <-- Optional conditions
|
|
envfile = "-/etc/default/daemon" <-- Optional env. file
|
|
log { } <-- Redirect output to log
|
|
command = "daemon ARGS" <-- Path to daemon, and its arguments
|
|
}
|
|
```
|
|
|
|
Only `command` is required, which makes simple cases short while leaving
|
|
room for more advanced uses:
|
|
|
|
service sshd {
|
|
command = "/usr/sbin/sshd -D"
|
|
}
|
|
|
|
Dependencies are handled using [conditions](conditions.md). One of
|
|
the most common conditions is to wait for basic networking to become
|
|
available:
|
|
|
|
service nginx {
|
|
description = "High performance HTTP server"
|
|
conditions = { "net/route/default" }
|
|
command = "nginx"
|
|
}
|
|
|
|
Here is another example where we instruct Finit to not start BusyBox
|
|
`ntpd` until `syslogd` has started properly. Finit waits for `syslogd`
|
|
to create its PID file, by default `/var/run/syslogd.pid`.
|
|
|
|
service ntpd {
|
|
runlevel = "2345"
|
|
conditions = { "pid/syslogd" }
|
|
reload-signal = "none"
|
|
log { }
|
|
command = "ntpd -n -N -p pool.ntp.org"
|
|
}
|
|
|
|
service syslogd {
|
|
description = "Syslog daemon"
|
|
runlevel = "S12345"
|
|
command = "syslogd -n"
|
|
}
|
|
|
|
Notice the empty `log` block, BusyBox `ntpd` uses `stderr` for logging
|
|
when run in the foreground. With it Finit redirects `stdout` +
|
|
`stderr` to the system log daemon using the command line `logger(1)`
|
|
tool.
|
|
|
|
A service, or task, can have multiple dependencies listed. Here we wait
|
|
for *both* `syslogd` to have started and basic networking to be up:
|
|
|
|
service ntpd {
|
|
runlevel = "2345"
|
|
conditions = { "pid/syslogd", "net/route/default" }
|
|
log { }
|
|
command = "ntpd -n -N -p pool.ntp.org"
|
|
}
|
|
|
|
If either condition fails, e.g. loss of networking, `ntpd` is stopped
|
|
and as soon as it comes back up again `ntpd` is restarted automatically.
|
|
|
|
> [!NOTE]
|
|
> Make sure daemons do *not* fork and detach themselves from the controlling
|
|
> TTY, usually an `-n` or `-f` flag, or `-D` as in the case of OpenSSH above.
|
|
> If it detaches itself, Finit cannot monitor it and will instead try to
|
|
> restart it.
|
|
|
|
[finit.conf(5)]: https://man.troglobit.com/man5/finit.conf.5.html
|
|
[infix]: https://kernelkit.github.io
|
|
[myLinux]: https://github.com/troglobit/myLinux/
|
|
[contrib]: https://github.com/finit-project/finit/tree/master/contrib
|