Compare commits

..
20 Commits
Author SHA1 Message Date
Joachim Wiberg 185a72bd14 Bump version for v4.11 GA release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-27 19:29:48 +01:00
Joachim Wiberg cd32c623cf plugins: ignore PID file events for svc_t in setup/teardown/cleanup
An svc_t (service/sysv) that is in setup, teardown, or cleanup state
must be ignored by the pidfile plugin for any events regarding PID
files.  E.g., a setup script for a sysv service may create a PID file
to alert the system that a setup process for the service is running.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-27 19:17:04 +01:00
Joachim Wiberg ac4b9c2f93 Unblock signals for pre/post/ready/cleanup scripts
The service_fork() function blocks all signals for the new process, it
is up to the callee to call sig_unblock() before calling exec().

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-27 19:10:56 +01:00
Joachim Wiberg 5e9591d0a8 Set correct -rc version
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-27 10:46:16 +01:00
Joachim Wiberg e3bcf9bf16 Update ChangeLog and bump version for v4.11 release
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-27 10:28:39 +01:00
Joachim Wiberg 84fd3196b0 doc: clarify what is required for moving from runlevel S to 2
All run/tasks must complete before Finit moves to runlevel 2.  This
critical piece of information has mysteriously been missing from the
documentation since the start.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-27 10:23:11 +01:00
Joachim Wiberg 994e51e34f Convert **Note:** et al to GitHub Markdown alerts
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-27 10:23:10 +01:00
Joachim Wiberg 0a7814b391 Merge commit from fork
Improve argument handling when launching login
2025-03-27 07:00:54 +01:00
Joachim Wiberg 73f72b39cf Merge pull request #433 from aanderse/patch-1 2025-03-22 19:27:41 +01:00
Aaron Andersen 02e0aa7383 fixup: links in config.md 2025-03-22 18:06:05 +00:00
Joachim Wiberg 6528628b5c getty: improve argument handling when launching login
Add explicit argument separator before username to ensure correct
parsing of the login command regardless of username format.  This
follows best practices for command execution and prevents unexpected
behavior when processing special characters in usernames.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-18 13:18:10 +01:00
Joachim Wiberg 1480657982 Update ChangeLog, serious issues with stopping services
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-18 07:27:00 +01:00
Joachim Wiberg 33e378a345 Fix #432: allow services in 'setup' to be stopped
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-18 07:21:44 +01:00
Joachim Wiberg b695b46a9d Revert last part of 91a9c83, fallback SIGKILL when stopping services
When a service is stopped, but does not respond to the default SIGTERM,
a fallback kicks in after 3 seconds (default) to send SIGKILL.  Since
91a9c83 (v3.2-rc2) this has however not worked since the signal was
only sent to the process group.

It is the job of service_monitor(), when it reaps the process leader,
to forward the signal to the process group.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-18 07:18:16 +01:00
Joachim Wiberg 0e61ed727f Add helper function, svc_is_stopped() when stopped by user
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-18 07:17:37 +01:00
Joachim Wiberg e9d60a6c04 Minor, coding style
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-18 07:17:23 +01:00
Joachim Wiberg 5e9edf9deb Update ChangeLog and bump version for 4.11 release cycle
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-17 18:43:04 +01:00
Joachim Wiberg 8ed2751ae1 Fix pre/post/ready/cleanup script execution if env:file is missing
Don't try to source an optional env:file if it is missing.  Otherwise
execution of pre/post/ready/cleanup script will fail.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-17 18:39:05 +01:00
Joachim Wiberg 7fec66dc09 Simplify, svc_checkenv() already checks if optional
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-17 18:38:31 +01:00
Joachim Wiberg 75fa868a4b Fix various typos found by codepsell
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2025-03-17 16:46:28 +01:00
29 changed files with 312 additions and 191 deletions
+2 -1
View File
@@ -24,7 +24,8 @@ the maintainer(s) and make it easier for them to include your code.
Coding Style Coding Style
------------ ------------
> **Tip:** Always submit code that follows the style of surrounding code! > [!TIP]
> Always submit code that follows the style of surrounding code!
First of all, lines are allowed to be longer than 72 characters these First of all, lines are allowed to be longer than 72 characters these
days. In fact, there exist no enforced maximum, but keeping it around days. In fact, there exist no enforced maximum, but keeping it around
+28 -4
View File
@@ -3,6 +3,29 @@ Change Log
All relevant changes are documented in this file. All relevant changes are documented in this file.
[4.11][] - 2025-03-27
---------------------
### Changes
- Update documentation regarding transition from runlevel S to 2, how
run/tasks must "complete" before Finit can move to the next runlevel
- Improve argument handling in bundled getty when launching login
### Fixes
- Fix #432: allow services in `setup` state to be stopped. This fixes
a serious blocker introduced in 4.10 that prevented systems from
being rebooted when any service was in this state
- Fix fallback `SIGKILL` when stopping a service with `SIGTERM` does
not work. This fixes a serious issue with services not responding to
the default `SIGTERM`
- Fix pre/post/ready/cleanup script execution if service has an
optional `env:file` (leading `-`)
- Fix blocked signals for pre/post/ready/cleanup scripts preventing
normal shutdown when a service/sysv is stopped in its setup state
- Fix issue where a pre:script creates a PID file in `/run` cause the
service to move from setup state to running. Any `svc_t` in setup,
teardown, or cleanup state should be ignored in the pidfile plugin
[4.10][] - 2025-03-03 [4.10][] - 2025-03-03
--------------------- ---------------------
@@ -89,7 +112,7 @@ All relevant changes are documented in this file.
### Fixes ### Fixes
- Fix #397: system shutdown/reboot can block on console input if action - Fix #397: system shutdown/reboot can block on console input if action
is started remotely (ssh). Caused by legact TTY screen size probing, is started remotely (ssh). Caused by legacy TTY screen size probing,
removed from both bootstrap and shutdown/reboot removed from both bootstrap and shutdown/reboot
- Fix #400: both `HOOK_MOUNT_ERROR` and `sulogin()` fail to trigger on - Fix #400: both `HOOK_MOUNT_ERROR` and `sulogin()` fail to trigger on
either mount or `fsck` errors. Problem caused by unresolved status either mount or `fsck` errors. Problem caused by unresolved status
@@ -347,7 +370,7 @@ All relevant changes are documented in this file.
`/etc/finit.conf`. `/etc/finit.conf`.
For the complete experience a new top-level configuration file directive For the complete experience a new top-level configuration file directive
`rcsd PATH` has aslo been added. It in turn can be used by `factory.conf` `rcsd PATH` has also been added. It in turn can be used by `factory.conf`
as follows to override `/etc/finit.d`: as follows to override `/etc/finit.d`:
rcsd /etc/factory.d rcsd /etc/factory.d
@@ -930,7 +953,7 @@ make sure to read the whole change log when upgrading.
previously hard-coded in Finit, e.g., starting the bundled watchdogd, previously hard-coded in Finit, e.g., starting the bundled watchdogd,
various distro packed udevd and other hotplugging tools various distro packed udevd and other hotplugging tools
* A proper rescue mode has been added. It is started extremely early * A proper rescue mode has been added. It is started extremely early
and is protected with a bundled `suslogin`. Exiting rescue mode now and is protected with a bundled `sulogin`. Exiting rescue mode now
brings up the system as a normal boot, as one expects brings up the system as a normal boot, as one expects
* Support for `sysv` start/stop scripts as well as monitoring forking * Support for `sysv` start/stop scripts as well as monitoring forking
services, stared using `sysv` or `service` stanza services, stared using `sysv` or `service` stanza
@@ -1761,7 +1784,8 @@ Major bug fix release.
* Initial release * Initial release
[UNRELEASED]: https://github.com/troglobit/finit/compare/4.10...HEAD [UNRELEASED]: https://github.com/troglobit/finit/compare/4.11...HEAD
[4.11]: https://github.com/troglobit/finit/compare/4.10...4.11
[4.10]: https://github.com/troglobit/finit/compare/4.9...4.10 [4.10]: https://github.com/troglobit/finit/compare/4.9...4.10
[4.9]: https://github.com/troglobit/finit/compare/4.8...4.9 [4.9]: https://github.com/troglobit/finit/compare/4.8...4.9
[4.8]: https://github.com/troglobit/finit/compare/4.7...4.8 [4.8]: https://github.com/troglobit/finit/compare/4.7...4.8
+20 -15
View File
@@ -61,12 +61,13 @@ distributions:
* [Alpine Linux](contrib/alpine/), and * [Alpine Linux](contrib/alpine/), and
* [Debian GNU/Linux](contrib/debian/), also works on Ubuntu/Linux Mint * [Debian GNU/Linux](contrib/debian/), also works on Ubuntu/Linux Mint
> **Note:** support for various Linux distributions does not mean Finit > [!NOTE]
> installs easily on all architectures. The bundled install scripts are > Support for various Linux distributions does not mean Finit installs
> examples for standard installations, tested on amd64 (x86_64) systems. > easily on all architectures. The bundled install scripts are examples
> Custom setups, e.g., for embedded systems, can be found in any of the > for standard installations, tested on amd64 (x86_64) systems. Custom
> following [Buildroot][] based examples: [myLinux][], [Infix][], or the > setups, e.g., for embedded systems, can be found in the following
> plain [br2-finit-demo](https://github.com/troglobit/br2-finit-demo). > [Buildroot][] based examples: [myLinux][], [Infix][], or the plain
> [br2-finit-demo](https://github.com/troglobit/br2-finit-demo).
Example Example
@@ -78,9 +79,10 @@ be placed in `/etc/finit.d/available` and enabled by an operator using
the [initctl](#commands--status) tool. See the above mentioned Linux the [initctl](#commands--status) tool. See the above mentioned Linux
distributions, or [myLinux][]. distributions, or [myLinux][].
> **Note:** as of Finit v4.4, .conf lines can be broken up using the > [!TIP]
> standard UNIX continuation character (`\`), also trailing comments are > As of Finit v4.4, `.conf` lines can be broken up using the standard
> now supported. The latter means you need to escape any hashes used in > UNIX continuation character (`\`), trailing comments are now also
> supported. The latter means you need to escape any hashes used in
> directives and descriptions (`\#`). For more on this and examples, > directives and descriptions (`\#`). For more on this and examples,
> see the [finit.conf(5)][] manual or [doc/config.md](doc/config.md). > see the [finit.conf(5)][] manual or [doc/config.md](doc/config.md).
@@ -285,6 +287,7 @@ run [S] /path/to/ident --
task [2] <hw/model/foo> /path/to/foo-init -- Initializing Foo board task [2] <hw/model/foo> /path/to/foo-init -- Initializing Foo board
``` ```
> [!TIP]
> Notice the trick with an empty description to hide the call to `ident` > Notice the trick with an empty description to hide the call to `ident`
> in the Finit progress output. > in the Finit progress output.
@@ -367,9 +370,10 @@ The `initctl` tool has three commands to help debug and optimize the
setup and monitoring of cgroups. See the `ps`, `top`, and `cgroup` setup and monitoring of cgroups. See the `ps`, `top`, and `cgroup`
commands for details. commands for details.
> **Note:** systems that do not support cgroups, specifically version 2, > [!NOTE]
> are automatically detected. On such systems the above functionality > Systems that do not support cgroups, specifically version 2, are
> is disabled early at boot. > automatically detected. On such systems the above functionality is
> disabled early at boot.
Runparts & /etc/rc.local Runparts & /etc/rc.local
@@ -573,9 +577,10 @@ file must be used to tell Finit to stop and start it on `reload` and
`runlevel` changes. If `<>` holds more [conditions](doc/conditions.md), `runlevel` changes. If `<>` holds more [conditions](doc/conditions.md),
these will also affect how a service is maintained. these will also affect how a service is maintained.
> **Note:** even though it is possible to start services not belonging in > [!NOTE]
> the current runlevel these services will not be respawned automatically > Even though it is possible to start services not belonging in the
> by Finit if they exit (crash). Hence, if the runlevel is 2, the below > current runlevel these services will not be respawned automatically by
> Finit if they exit (crash). Hence, if the runlevel is 2, the below
> Dropbear SSH service will not be restarted if it is killed or exits. > Dropbear SSH service will not be restarted if it is killed or exits.
The `status` command is the default, it displays a quick overview of all The `status` command is the default, it displays a quick overview of all
+1 -1
View File
@@ -1,4 +1,4 @@
AC_INIT([Finit], [4.10], [https://github.com/troglobit/finit/issues], AC_INIT([Finit], [4.11], [https://github.com/troglobit/finit/issues],
[finit], [https://troglobit.com/projects/finit/]) [finit], [https://troglobit.com/projects/finit/])
AC_CONFIG_AUX_DIR(aux) AC_CONFIG_AUX_DIR(aux)
AM_INIT_AUTOMAKE([1.11 foreign dist-xz subdir-objects]) AM_INIT_AUTOMAKE([1.11 foreign dist-xz subdir-objects])
+2 -1
View File
@@ -1,7 +1,8 @@
HowTo: Finit on Alpine Linux 3.4...3.19 HowTo: Finit on Alpine Linux 3.4...3.19
======================================= =======================================
> **Blog** https://troglobit.com/post/2021-02-12-alpine-linux-with-finit/ > [!TIP]
> https://troglobit.com/post/2021-02-12-alpine-linux-with-finit/
HowTo use Finit to boot an [Alpine Linux][] system. It is assumed that HowTo use Finit to boot an [Alpine Linux][] system. It is assumed that
the user has already installed make, a compiler, C library header files, the user has already installed make, a compiler, C library header files,
+5 -3
View File
@@ -20,8 +20,9 @@ tools pre-systemd work as intended.
root@debian:~# apt install initscripts console-setup root@debian:~# apt install initscripts console-setup
> **Note:** as of Debian 11 (Bullseye), libuev and libite are part of > [!TIP]
> the main section of Debian. So just install the -dev packages :) > As of Debian 11 (Bullseye), libuev and libite are part of the main
> section of Debian. So just install the -dev packages :)
The following script can then be used to configure, build, install and The following script can then be used to configure, build, install and
set up your system to run Finit: set up your system to run Finit:
@@ -47,7 +48,8 @@ comands to `initctl`, followed by `reload` to activate your changes.
You can also use a standard [/etc/rc.local](rc.local) for one-shot tasks You can also use a standard [/etc/rc.local](rc.local) for one-shot tasks
and initialization like keyboard language etc. and initialization like keyboard language etc.
> **NOTE:** X Window system, you may need to `sudo apt install elogind` > [!NOTE]
> For the X Window system, you may need to `sudo apt install elogind`
> (Bullseye and later), followed by `initctl reload` to activate it (it > (Bullseye and later), followed by `initctl reload` to activate it (it
> is enabled by default), and logout/login again. The elogind daemon > is enabled by default), and logout/login again. The elogind daemon
> ensures a regular non-root user can start and interact with an X > ensures a regular non-root user can start and interact with an X
+30 -24
View File
@@ -1,5 +1,5 @@
Building Building Finit
======== ==============
* [Introduction](#introduction) * [Introduction](#introduction)
* [Configure](#configure) * [Configure](#configure)
@@ -17,14 +17,15 @@ optional plugins to enable. It depends on two external libraries:
- [libuEv][], the event loop - [libuEv][], the event loop
- [libite][] (-lite), much needed frog DNA - [libite][] (-lite), much needed frog DNA
**NOTE:** Most free/open source software that uses `configure` default > [!IMPORTANT]
to install to `/usr/local`. However, some Linux distributions do no > Most free/open source software packages that use `configure` default
longer search that path for installed software, e.g. Fedora and Alpine > to install to `/usr/local`. However, some Linux distributions do no
Linux. To get finit's configure script to find its dependencies you > longer search that path for installed software, e.g. Fedora and Alpine
have to help the `pkg-config` tool a bit if you do not change the > Linux. To get finit's configure script to find its dependencies you
default prefix path: > have to help the `pkg-config` tool a bit if you do not change the
> default prefix path:
PKG_CONFIG_LIBDIR=/usr/local/lib/pkgconfig ./configure >
> PKG_CONFIG_LIBDIR=/usr/local/lib/pkgconfig ./configure
The configure script checks for all dependencies, including the correct The configure script checks for all dependencies, including the correct
version of the above mentioned libraries. Currently required versions: version of the above mentioned libraries. Currently required versions:
@@ -71,12 +72,13 @@ Below are a few of the main switches to configure:
For more configure flags, see <kbd>./configure --help</kbd> For more configure flags, see <kbd>./configure --help</kbd>
> **Note:** the configure script is not available in the GIT sources. It is > [!NOTE]
> however included in (officially supported) released tarballs. The > The configure script is not available in the GIT sources. It is
> idea is that you should not need GNU autotools to build, only the > however included in (officially supported) released tarballs. The
> above mentioned dependencies, a POSIX shell, a C compiler and make. > idea is that you should not need GNU autotools to build, only the
> Any contributing to Finit can generate it from `configure.ac` using > above mentioned dependencies, a POSIX shell, a C compiler and make.
> the `autogen.sh` script. > Any contributing to Finit can generate it from `configure.ac` using
> the `autogen.sh` script.
Example Example
@@ -115,10 +117,11 @@ Linux config to:
CONFIG_UEVENT_HELPER_PATH="/sbin/mdev" CONFIG_UEVENT_HELPER_PATH="/sbin/mdev"
**Note:** If you run into problems starting Finit, take a look at > [!TIP]
`finit.c`. One of the most common problems is a custom Linux kernel > If you run into problems starting Finit, take a look at `finit.c`.
build that lack `CONFIG_DEVTMPFS`. Another is too much cruft in the > One of the most common problems is a custom Linux kernel build that
system `/etc/fstab`. > lack `CONFIG_DEVTMPFS`. Another is too much cruft in the system
> `/etc/fstab`.
Running Running
@@ -157,8 +160,10 @@ enabled. The default Finit rescue mode configuration is installed into
By default the a root shell, without login, is started. By default the a root shell, without login, is started.
> **Note:** in this mode `initctl` will not work. Use the `-f` flag to > [!IMPORTANT]
> force `reboot`, `shutdown`, or `poweroff`. > In rescue mode `initctl` will not work, the same goes for `reboot`,
> `shutdown`, and `poweroff` commands, provided they are the Finit
> versions of these commands. Use the `-f` flag to force the action.
Debugging Debugging
@@ -187,8 +192,9 @@ kernel usually reboots: `configure --enable-emergency-shell`. However,
the behavior of Finit is severely limited when this is enabled, so use the behavior of Finit is severely limited when this is enabled, so use
it only for debugging start up issues when Finit crashes. it only for debugging start up issues when Finit crashes.
**NOTE:** Neither of these options should be enabled on production > [!CAUTION]
systems since they can potentially give a user root access. > None of these options should be enabled on production systems since
> they can potentially give a user root access.
[1]: ftp://troglobit.com/finit/finit-4.3.tar.gz [1]: ftp://troglobit.com/finit/finit-4.3.tar.gz
+6 -4
View File
@@ -4,10 +4,11 @@ Tips & Tricks with the kernel cmdline
This document summarizes the different boot parameters that can be This document summarizes the different boot parameters that can be
passed on the Linux kernel command line. Not limited to Finit. passed on the Linux kernel command line. Not limited to Finit.
The `bool` setting is one of `on, off, true false, 1, 0`. > [!IMPORTANT]
> Remember to use `--` to separate kernel parameters from parameters to
> init. E.g., `init=/sbin/finit -- finit.debug rescue`
> **NOTE:** remember to use `--` to separate kernel parameters from The `bool` setting is one of `on, off, true false, 1, 0`.
> parameters to init. E.g., `init=/sbin/finit -- finit.debug rescue`
* `debug`: Enable kernel debug. Debug messages are printed to the * `debug`: Enable kernel debug. Debug messages are printed to the
console until Finit starts up, unless `loglevel=7` (below) is used. console until Finit starts up, unless `loglevel=7` (below) is used.
@@ -30,7 +31,8 @@ The `bool` setting is one of `on, off, true false, 1, 0`.
Very useful for selecting different boot modes, e.g. manufacturing test, Very useful for selecting different boot modes, e.g. manufacturing test,
firmware upgrade, or rescue mode. firmware upgrade, or rescue mode.
> Note: `<boot/...>` conditions cannot be cleared with `initctl`! > [!NOTE]
> `<boot/...>` conditions cannot be cleared with `initctl`!
* `finit.config=/path/to/alternative/finit.conf`: override the * `finit.config=/path/to/alternative/finit.conf`: override the
compile-time bootstrap config file, default: compile-time bootstrap config file, default:
+19 -11
View File
@@ -47,9 +47,10 @@ both the `pid/setupd` *and* `pid/zebra` conditions are satisfied. A
`pid/` condition is satisfied by the corresponding service's PID file `pid/` condition is satisfied by the corresponding service's PID file
being created, i.e., the service's default readiness notification. being created, i.e., the service's default readiness notification.
**NOTE:** Conditions also stop services when a condition is no longer > [!IMPORTANT]
asserted. I.e., if the Zebra process above stops or restarts, netd > Conditions also stop services when a condition is no longer asserted.
will also stop or restart. > I.e., if the `zebra` process above stops or restarts, `netd` will also
> stop or restart.
Another example is `dropbear`, it does not support `SIGHUP`, but we can Another example is `dropbear`, it does not support `SIGHUP`, but we can
also see optional sourcing of arguments from an environment file: also see optional sourcing of arguments from an environment file:
@@ -106,11 +107,16 @@ on this, see [Internals](#internals).) Thus, after a reconfiguration it
is up to the "owner" of the condition to convey the new (or possibly is up to the "owner" of the condition to convey the new (or possibly
unchanged) state of it. unchanged) state of it.
> **Note:** For `pid/` conditions it is expected that services "touch"
> or recreate their PID file on `SIGHUP`.
Static (one-shot) conditions, like `usr/`, never enter the `flux` state. Static (one-shot) conditions, like `usr/`, never enter the `flux` state.
> [!IMPORTANT]
> For `pid/` conditions it is expected that the service reassert, i.e.,
> "touch" or recreate, their PID file on `SIGHUP`. This can be done by
> calling `utimensat()` on the PID file. Provided, of course, that the
> service supports reloading on `SIGHUP`, otherwise it will be restarted
> by Finit when they instead exit on the signal. For such services, use
> `<!>` to tell Finit the service does not support `SIGHUP`.
Built-in Conditions Built-in Conditions
------------------- -------------------
@@ -171,9 +177,10 @@ Built-in conditions:
- `boot/arg` - `boot/arg`
- `dev/node` and `dev/dir/node` - `dev/node` and `dev/dir/node`
**Note:** `up` means administratively up, the interface flag `IFF_UP`. > [!NOTE]
`running` is the `IFF_RUNNING` flag, meaning operatively up. The > Here, `up` means administratively up, the interface flag `IFF_UP`.
difference is that `running` tells if the NIC has link. > `running` is the `IFF_RUNNING` flag, meaning operatively up. The
> difference is that `running` tells if the NIC has link.
Composition Composition
@@ -205,8 +212,9 @@ the service stanza for the daemon. It is far from optimal since any
synchronization of depending services may fail due to the daemon not synchronization of depending services may fail due to the daemon not
having reinitialized/created their IPC sockets, or similar. having reinitialized/created their IPC sockets, or similar.
> **Note:** in versions of Finit prior to v4, the PID conditions were > [!NOTE]
> called 'svc' conditions, and they were far more complex. > In versions of Finit prior to v4, the PID conditions were called 'svc'
> conditions, and they were far more complex.
Debugging Debugging
+113 -82
View File
@@ -18,8 +18,8 @@ Finit Configuration
* [Alternate rcS.d/](#alternate-rcs-d-) * [Alternate rcS.d/](#alternate-rcs-d-)
* [Resource Limits](#resource-limits) * [Resource Limits](#resource-limits)
* [Runlevels](#runlevels) * [Runlevels](#runlevels)
* [One-shot Commands (sequence)](#one-shot-commands--sequence-) * [One-shot Commands (sequence)](#one-shot-commands-sequence)
* [One-shot Commands (parallel)](#one-shot-commands--parallel-) * [One-shot Commands (parallel)](#one-shot-commands-parallel)
* [SysV Init Scripts](#sysv-init-scripts) * [SysV Init Scripts](#sysv-init-scripts)
* [Services](#services) * [Services](#services)
* [Run-parts Scripts](#run-parts-scripts) * [Run-parts Scripts](#run-parts-scripts)
@@ -46,8 +46,9 @@ Plugins start at [hook points](plugins.md#hooks) and can run various set
up, or install event handlers that later provide runtime services, e.g., up, or install event handlers that later provide runtime services, e.g.,
PID file monitoring, or [conditions](conditions.md). PID file monitoring, or [conditions](conditions.md).
> **Tip:** see [SysV Init Compatibility](#sysv-init-compatibility) for > [!TIP]
> help to quickly get going with an existing SysV or BusyBox init setup. > See [SysV Init Compatibility](#sysv-init-compatibility) for help to
> quickly get going with an existing SysV or BusyBox init setup.
### Configuration Files ### Configuration Files
@@ -127,8 +128,9 @@ properties of the `run` statement. For an example on the relation of
`service` and `run` statements, and dependency handling between them, `service` and `run` statements, and dependency handling between them,
see [Conditional Loading](#conditional-loading), below. see [Conditional Loading](#conditional-loading), below.
> **Note:** the `finit.conf` and `finit.d/` names are only defaults. > [!NOTE]
> They can be changed at compile-time with two `configure` options: > The names `finit.conf` and `finit.d/` are only defaults. They can be
> changed at compile-time with two `configure` options:
> `--with-config=/etc/foo.conf` and `--with-rcsd=/var/foo.d`. > `--with-config=/etc/foo.conf` and `--with-rcsd=/var/foo.d`.
> >
> They can also be overridden from the [kernel command line](cmdline.md) > They can also be overridden from the [kernel command line](cmdline.md)
@@ -187,8 +189,9 @@ above, provided their respective mount point exists.
With all filesystems mounted, Finit calls `swapon`. With all filesystems mounted, Finit calls `swapon`.
> **Tip:** to see what happens when all filesystems are mounted, have a > [!TIP]
> look at the [`bootmisc.so` plugin](plugins.md). > To see what happens when all filesystems are mounted, have a look at
> the [`bootmisc.so` plugin](plugins.md).
At shutdown, and after having stopped all services and other lingering At shutdown, and after having stopped all services and other lingering
processes have been killed, filesystems are unmounted in the reverse processes have been killed, filesystems are unmounted in the reverse
@@ -198,6 +201,18 @@ order, and `swapoff` is called.
### Runlevels ### Runlevels
Finit supports runlevels, but unlike other init systems runlevels are
declared per service/run/task/sysv command. When booting up a system
Finit pass through three phases:
1. Setting up the console, parsing any command line options, and other
housekeeping tasks like mounting all filesystems, and calling `fsck`
2. Starting all run/task/services in runlevel S, then waiting for all
services to have started, and all run/tasks to have completed
3. Go to runlevel 2, or whatever the user has set in the configuration
Available runlevels:
- ` S`: bootStrap - ` S`: bootStrap
- ` 1`: Single user mode - ` 1`: Single user mode
- `2-5`: traditional multi-user mode - `2-5`: traditional multi-user mode
@@ -205,37 +220,40 @@ order, and `swapoff` is called.
- `7-9`: multi-user mode (extra) - `7-9`: multi-user mode (extra)
- ` 0`: shutdown - ` 0`: shutdown
Runlevels are declared per service/run/task/sysv command. Starting in Runlevel S (bootStrap), is for tasks supposed to run once at boot, and
runlevel S (bootStrap), usually only for tasks supposed to run once at services like `syslogd`, which need to start early and run throughout
boot, and services like `syslogd`, which you need to start and run the lifetime of your system.
throughout the whole time your system is up.
Before `S` is started, however, Finit performs a lot of housekeeping Example:
tasks like mounting all filesystems, calling `fsck` if needed, and
making sure the everything is OK.
task [S] /lib/console-setup/console-setup.sh task [S] /lib/console-setup/console-setup.sh
service [S12345] env:-/etc/default/rsyslog rsyslogd -n $RSYSLOGD_ARGS service [S12345] env:-/etc/default/rsyslog rsyslogd -n $RSYSLOGD_ARGS
After runlevel S, Finit proceeds to runlevel 2. This can be changed in When bootstrap has completed, Finit moves to runlevel 2. This can be
`/etc/finit.conf` using the `runlevel N` directive, or by a script changed in `/etc/finit.conf` using the `runlevel N` directive, or by a
running in runlevel S that calls, e.g., `initctl runlevel 9`. The script running in runlevel S that calls, e.g., `initctl runlevel 9`.
latter is useful if startup scripts detect problems outside of Finit's The latter is useful if startup scripts detect problems outside of
control, e.g., critical services/devices missing or hardware problems. Finit's control, e.g., critical services/devices missing or hardware
problems.
Before starting the services in runlevel 2, Finit first stops everything Each runlevel must be allowed to "complete". Meaning, all services in
that is not allowed to run in 2, and then brings up networking. runlevel S must have started and all run/tasks have been started and
Networking is expected to be available in all runlevels except: S, 1 collected (exited). Finit waits 120 seconds for all run/tasks in S to
(single user level), 6, and 0. Networking is enabled either by the complete before proceeding to 2.
`network script` directive, or if you have an `/etc/network/interfaces`
file, Finit calls `ifup -a` -- at the very least the loopback interface
is brought up.
> **Note:** when moving from runlevel S to 2, all run/task/services that Finit first stops everything that is not allowed to run in 2, and then
> were constrained to runlevel S only are dropped from bookkeeping. So brings up networking. Networking is expected to be available in all
> when reaching the prompt, `initctl` will not show these run/tasks. runlevels except: S, 1 (single user level), 6, and 0. Networking is
> This is a safety mechanism to prevent bootstrap-only tasks from enabled either by the `network script` directive, or if you have an
> accidentally being run again. E.g., `console-setup.sh` above. `/etc/network/interfaces` file, Finit calls `ifup -a` -- at the very
least the loopback interface is brought up.
> [!NOTE]
> When moving from runlevel S to 2, all run/task/services that were
> constrained to runlevel S only are dropped from bookkeeping. So when
> reaching the prompt, `initctl` will not show these run/tasks. This is
> a safety mechanism to prevent bootstrap-only tasks from accidentally
> being run again. E.g., `console-setup.sh` above.
### Managing Services ### Managing Services
@@ -322,7 +340,8 @@ the `ps` command we can see that the process is started with:
foo -n --extra-arg=bar -s -x foo -n --extra-arg=bar -s -x
> **Note:** the leading `-` determines if Finit should treat a missing > [!NOTE]
> The leading `-` in `env:` determines if Finit should treat a missing
> environment file as blocking the start of the service or not. When > environment file as blocking the start of the service or not. When
> `-` is used, a missing environment file does *not* block the start. > `-` is used, a missing environment file does *not* block the start.
@@ -384,12 +403,13 @@ To synchronize two services the following condition can be used:
For details on the syntax and options, see below. For details on the syntax and options, see below.
> **Note:** on `initctl reload` conditions are normally set in "flux", > [!NOTE]
> while figuring out which to stop, start or restart. Services that > On `initctl reload` conditions are set in "flux", while figuring out
> need to be restarted have their `ready` condition removed prior to > which to stop, start or restart. Services that need to be restarted
> Finit sending them SIGHUP (if they support that), or stop-starting > have their `ready` condition removed prior to Finit sending them
> them. A daemon is expected to reassert its readiness, e.g. systemd > SIGHUP (if they support that), or stop-starting them. A daemon is
> style daemons to write `READY=1\n`. > expected to reassert its readiness, e.g. systemd style daemons to
> write `READY=1\n`.
> >
> However, the s6 notify mode does not support this because in s6 you > However, the s6 notify mode does not support this because in s6 you
> are expected to close your notify descriptor after having written > are expected to close your notify descriptor after having written
@@ -429,9 +449,10 @@ example employs a wrapper script in `/etc/start.d`.
# Execute the program # Execute the program
exec /usr/bin/program $OPTIONS exec /usr/bin/program $OPTIONS
> **Note:** the example sets `<!>` to denote that it doesn't support > [!NOTE]
> `SIGHUP`. That way Finit will stop/start the service > The example sets `<!>` to denote that it doesn't support `SIGHUP`.
> instead of sending SIGHUP at restart/reload events. > That way Finit will stop/start the service instead of sending SIGHUP
> at restart/reload events.
Templating Templating
@@ -514,6 +535,7 @@ A daemon using `SCHED_RR` currently need to run outside the default cgroups.
service [...] <...> cgroup.root /path/to/daemon arg -- Real-Time process service [...] <...> cgroup.root /path/to/daemon arg -- Real-Time process
> [!NOTE]
> Linux cgroups and details surrounding values are not explained in the > Linux cgroups and details surrounding values are not explained in the
> Finit documentation. The Linux admin-guide cover this well: > Finit documentation. The Linux admin-guide cover this well:
> <https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html> > <https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html>
@@ -539,12 +561,9 @@ service name:sysklogd [S123456789] \
``` ```
The .conf files `/etc/finit.conf` and `/etc/finit.d/*` support the The .conf files `/etc/finit.conf` and `/etc/finit.d/*` support the
following directives: following directives. Some directives have restrictions, e.g., only
available at bootstrap, runlevel `S`, see [Limitations](#limitations)
below for details.
> **Note:** not all directives are available in `/etc/finit.d/*.conf`
> and some directives are only available at bootstrap, runlevel `S`,
> see [Limitations](#limitations) below for details.
### Hostname ### Hostname
@@ -556,7 +575,8 @@ the contents of that file is used.
Deprecated. We recommend using `/etc/hostname` instead. Deprecated. We recommend using `/etc/hostname` instead.
> **Note:** only read and executed in runlevel S (bootstrap). > [!NOTE]
> Only read and executed in runlevel S (bootstrap).
### Kernel Modules ### Kernel Modules
@@ -574,7 +594,8 @@ BusyBox mdev tool, add to `/etc/mdev.conf`:
$MODALIAS=.* root:root 0660 @modprobe -b "$MODALIAS" $MODALIAS=.* root:root 0660 @modprobe -b "$MODALIAS"
> **Note:** only read and executed in runlevel S (bootstrap). > [!NOTE]
> Only read and executed in runlevel S (bootstrap).
### Networking ### Networking
@@ -587,7 +608,8 @@ Deprecated. We recommend using dedicated task/run stanzas per runlevel,
or `/etc/network/interfaces` if you have a system with `ifupdown`, like or `/etc/network/interfaces` if you have a system with `ifupdown`, like
Debian, Ubuntu, Linux Mint, or an embedded BusyBox system. Debian, Ubuntu, Linux Mint, or an embedded BusyBox system.
> **Note:** only read and executed in runlevel S (bootstrap). > [!NOTE]
> Only read and executed in runlevel S (bootstrap).
### Alternate finit.d/ ### Alternate finit.d/
@@ -608,8 +630,9 @@ another set of .conf files, e.g.:
rcsd /etc/factory.d rcsd /etc/factory.d
> **Note:** this directive is only available from the top-level > [!NOTE]
> bootstrap .conf file. > This directive is only available from the top-level bootstrap .conf
> file, usually `/etc/finit.conf`.
### Resource Limits ### Resource Limits
@@ -642,16 +665,18 @@ stanzas can share the same rlimits if they are in the same .conf.
**Syntax:** `runlevel <N>` **Syntax:** `runlevel <N>`
The system runlevel to go to after bootstrap (S) has completed. `N` The system runlevel to go to after bootstrap (S) has completed. `N` is
is the runlevel number 0-9, where 6 is reserved for reboot and 0 for the runlevel number 0-9, where 6 is reserved for reboot and 0 for halt.
halt. Completed in this context means all services have been started and all
run/tasks have been started and collected.
It is recommended to keep runlevel 1 as single-user mode, because It is recommended to keep runlevel 1 as single-user mode, because
Finit disables networking in this mode. Finit disables networking in this mode.
*Default:* 2 *Default:* 2
> **Note:** only read and executed in runlevel S (bootstrap). > [!NOTE]
> Only read and executed in runlevel S (bootstrap).
### One-shot Commands (sequence) ### One-shot Commands (sequence)
@@ -665,10 +690,11 @@ optional arguments and description. `run` commands are guaranteed to be
completed before running the next command. Useful when serialization is completed before running the next command. Useful when serialization is
required. required.
> **Warning:** try to avoid the `run` command. It blocks much of the > [!WARNING]
> functionality in Finit, like (re)starting other (perhaps crashing) > Try to avoid the `run` command. It blocks much of the functionality
> services while a `run` task is executing. Use other synchronization > in Finit, like (re)starting other (perhaps crashing) services while a
> mechanisms instead, like conditions. > `run` task is executing. Use other synchronization mechanisms
> instead, like conditions.
Incomplete list of unsupported `initctl` commands in `run` tasks: Incomplete list of unsupported `initctl` commands in `run` tasks:
@@ -708,7 +734,7 @@ non-trivial constructs are better placed in a separate shell script.
Similar to `task` is the `sysv` stanza, which can be used to call SysV Similar to `task` is the `sysv` stanza, which can be used to call SysV
style scripts. The primary intention for this command is to be able to style scripts. The primary intention for this command is to be able to
re-use much of existing setup and init scripts in Linux distributions. reuse much of existing setup and init scripts in Linux distributions.
When entering an allowed runlevel, Finit calls `init-script start`, when When entering an allowed runlevel, Finit calls `init-script start`, when
entering a disallowed runlevel, Finit calls `init-script stop`, and if entering a disallowed runlevel, Finit calls `init-script stop`, and if
@@ -723,7 +749,8 @@ file, but rather watch that file for the resulting forked-off PID. This
syntax also works for forking daemons that do not have a command line syntax also works for forking daemons that do not have a command line
option to run it in the foreground, more on this below in `service`. option to run it in the foreground, more on this below in `service`.
> **Tip:** see also [SysV Init Compatibility](#sysv-init-compatibility). > [!TIP]
> See also [SysV Init Compatibility](#sysv-init-compatibility).
### Services ### Services
@@ -731,13 +758,13 @@ option to run it in the foreground, more on this below in `service`.
**Syntax:** `service [LVLS] <COND> /path/to/daemon ARGS -- Optional description` **Syntax:** `service [LVLS] <COND> /path/to/daemon ARGS -- Optional description`
Service, or daemon, to be monitored and automatically restarted if it Service, or daemon, to be monitored and automatically restarted if it
exits prematurely. Finit tries to restart services that die, by exits prematurely. Finit tries to restart services that die, by default
default 10 times before giving up and marking them as *crashed*. 10 times before giving up and marking them as *crashed*. After which
After which they have to be manually restarted with `initctl restart they have to be manually restarted with `initctl restart NAME`. The
NAME`. The limits controling this are configurable, see the options limits controlling this are configurable, see the options below.
below.
> **Tip:** to allow endless restarts, see below option `respawn` > [!TIP]
> To allow endless restarts, see below option `respawn`
For daemons that support it, we recommend appending `--foreground`, For daemons that support it, we recommend appending `--foreground`,
`--no-background`, `-n`, `-F`, or similar command line argument to `--no-background`, `-n`, `-F`, or similar command line argument to
@@ -1034,8 +1061,9 @@ before continuing. None of them can issue commands to start, stop, or
restart other services. Also, ensure all your services and programs restart other services. Also, ensure all your services and programs
either terminate or start in the background or you will block Finit. either terminate or start in the background or you will block Finit.
> **Note:** `runparts` scrips are only read and executed in runlevel S. > [!NOTE]
> See [hook scripts](plugins.md#hooks) for other ways to run scripts at > `runparts` scripts are only read and executed in runlevel S. See
> [hook scripts](plugins.md#hooks) for other ways to run scripts at
> certain points during the complete lifetime of the system. > certain points during the complete lifetime of the system.
**Recommendations:** **Recommendations:**
@@ -1308,8 +1336,9 @@ This rescue mode can be disabled at configure time using:
The rescue mode comes in two flavors; *traditional* and *fallback*. The rescue mode comes in two flavors; *traditional* and *fallback*.
> **Note:** in this mode `initctl` will not work. Use the `-f` flag to > [!NOTE]
> force `reboot`, `shutdown`, or `poweroff`. > In this mode `initctl` will not work. Use the `-f` flag to force
> `reboot`, `shutdown`, or `poweroff`.
### Traditional ### Traditional
@@ -1321,11 +1350,12 @@ program is used instead. If a successful login is made, or if the user
exits (Ctrl-D), the rescue mode is ended and the system boots up exits (Ctrl-D), the rescue mode is ended and the system boots up
normally. normally.
> **Note:** the bundled sulogin in Finit can at configure time be given > [!WARNING]
> another user than the default (root). If the sulogin user does not > The bundled sulogin in Finit can at configure time be given another
> have a password, or __the account is locked__, the user is presented > user than the default (root). If the sulogin user does not have a
> with a password-less `"Press enter to enter maintenance mode."`, > password, or __the account is locked__, the user is presented with a
> prompt which opens up a root shell. > prompt: `"Press enter to enter maintenance mode."`, which will open
> up a root shell *without prompting for password*!
### Fallback ### Fallback
@@ -1373,10 +1403,11 @@ These can now also be set in any `.conf` file in `/etc/finit.d`.
There is, however, nothing preventing you from having all configuration There is, however, nothing preventing you from having all configuration
settings in `/etc/finit.conf`. settings in `/etc/finit.conf`.
> **Note:** The `/etc/finit.d` directory was previously the default > [!IMPORTANT]
> Finit [runparts](#run-parts-scripts) directory. Finit >=v4.0 > The default `rcsd`, i.e., `/etc/finit.d`, was previously the Finit
> no longer has a default `runparts` directory, make sure to > [runparts](#run-parts-scripts) directory. Finit >=v4.0 no longer has
> update your setup, or the finit configuration, accordingly. > a default `runparts` directory, make sure to update your setup, or the
> finit configuration, accordingly.
Watchdog Watchdog
+3 -2
View File
@@ -34,8 +34,9 @@ build time:
./configure --with-rcsd=/etc/init.d --with-config=/etc/init.d/init.conf ./configure --with-rcsd=/etc/init.d --with-config=/etc/init.d/init.conf
``` ```
> **Note:** remember `--prefix` et al as well, the default is likely > [!IMPORTANT]
> *not* what you want. See the [build docs][1] for details. > Remember `--prefix` et al as well, the default is likely *not* what
> you want. See the [build docs][1] for details.
The resulting directory structure is depicted below. Please notice how The resulting directory structure is depicted below. Please notice how
`/etc/finit.conf` now resides in the same sub-directory as a non-symlink `/etc/finit.conf` now resides in the same sub-directory as a non-symlink
+21 -16
View File
@@ -35,9 +35,10 @@ For your convenience a set of *optional* plugins are available:
files distributed with Finit. It is read first but can be overridden files distributed with Finit. It is read first but can be overridden
by any of the standard tmpfiles.d directories, e.g. `/etc/tmpfiles.d`. by any of the standard tmpfiles.d directories, e.g. `/etc/tmpfiles.d`.
> **Note:** On an embedded system both `/var` and `/run` can be `tmpfs` > [!NOTE]
> RAM disks and `/dev` is usually a `devtmpfs`. This must be defined > On an embedded system both `/var` and `/run` can be `tmpfs` RAM
> in the `/etc/fstab` file and in the Linux kernel config. > disks and `/dev` is usually a `devtmpfs`. This must be defined in
> the `/etc/fstab` file and in the Linux kernel config.
* *dbus.so*: Setup and start system message bus, D-Bus, at boot. * *dbus.so*: Setup and start system message bus, D-Bus, at boot.
_Optional plugin._ _Optional plugin._
@@ -63,8 +64,9 @@ For your convenience a set of *optional* plugins are available:
Enabled by default. Enabled by default.
> See the [Services](config.md#services) section in the configuration > [!TIP]
> guide for an example how to run `mdevd`, alternative to plain mdev. > See the [Services](config.md#services) section in the configuration
> guide for an example how to run `mdevd`, alternative to plain mdev.
* *rtc.so*: Restore and save system clock from/to RTC on boot/halt. * *rtc.so*: Restore and save system clock from/to RTC on boot/halt.
Enabled by default. Enabled by default.
@@ -89,16 +91,17 @@ For your convenience a set of *optional* plugins are available:
set index 1234 set index 1234
**Note:** unlike the traditional .conf `module` directive, which load Since these tasks run in the background, they return `[ OK ]` at boot,
any listed module immediately, this plugin creates a background `task` unless the modprobe tool does not exist. Check syslog for warnings
which load the module(s) in the background. The program is modprobe, and the actual status of the operation using `initctl`.
`/sbin/modprobe`, which you can override per .conf file:
set modprobe /path/to/maybe-a-modprobe-wrapper > [!IMPORTANT]
> Unlike the traditional .conf `module` directive, which load any listed
Since these tasks run in the background, they usually return `[ OK ]` > module immediately, this plugin creates a background `task` which load
at boot, unless the modprobe tool does not exist. Check syslog for > the module(s) in the background. The program is modprobe,
warnings and the actual status of the operation using `initctl`. > `/sbin/modprobe`, which you can override per .conf file:
>
> set modprobe /path/to/maybe-a-modprobe-wrapper
* *netlink.so*: Listens to Linux kernel Netlink events for gateway and * *netlink.so*: Listens to Linux kernel Netlink events for gateway and
interfaces. These events are then sent to the Finit service monitor interfaces. These events are then sent to the Finit service monitor
@@ -158,8 +161,10 @@ hook points:
EOF EOF
$ chmod +x /libexec/finit/hook/sys/down/foo.sh $ chmod +x /libexec/finit/hook/sys/down/foo.sh
> **Note:** to use hook scripts, even for pre-bootstrap and pre-shutdown > [!IMPORTANT]
> tasks, you must build with `configure --enable-hook-scripts-plugin`. > To use hook scripts, even for pre-bootstrap and pre-shutdown tasks,
> you must build with `configure --enable-hook-scripts-plugin`.
### Bootstrap Hooks ### Bootstrap Hooks
+3 -2
View File
@@ -22,8 +22,9 @@ Finit can *not* start and monitor a daemon that:
| ✔ | No | No | Yes, optionally | | ✔ | No | No | Yes, optionally |
| ✘ | Yes | No | No | | ✘ | Yes | No | No |
> **Note:** PID files is one mechanism used to assert conditions to > [!NOTE]
> synchronize the start and stop of other, dependent, services. > PID files is one mechanism used to assert conditions to synchronize
> the start and stop of other, dependent, services.
### Forks to Background w/ PID File ### Forks to Background w/ PID File
+1 -1
View File
@@ -41,7 +41,7 @@
* *
* Please note, the :ID is there for your benefit, it ensures that tasks * Please note, the :ID is there for your benefit, it ensures that tasks
* in Finit are unique. If you have two tasks with the same name and ID * in Finit are unique. If you have two tasks with the same name and ID
* (or no ID), the last one read replaces any preceeding one! * (or no ID), the last one read replaces any preceding one!
*/ */
#include <unistd.h> #include <unistd.h>
+17
View File
@@ -80,6 +80,23 @@ static void pidfile_update_conds(char *dir, char *name, uint32_t mask)
return; return;
} }
switch (svc->state) {
case SVC_TEARDOWN_STATE:
case SVC_CLEANUP_STATE:
case SVC_SETUP_STATE:
/*
* E.g., a setup script for a container may run in lieu
* of crun, trying to fetch a container image from the
* network. This script may want to advertise its PID
* to the system for clean and swift reboots.
*/
dbg("%s[%d]: ignoring any PID file changes in CLEANUP/TEARDOWN/SETUP",
svc_ident(svc, NULL, 0), svc->pid);
return;
default:
break;
}
/* Service condistion to set/clear */ /* Service condistion to set/clear */
mkcond(svc, cond, sizeof(cond)); mkcond(svc, cond, sizeof(cond));
+1 -1
View File
@@ -562,7 +562,7 @@ static void api_cb(uev_t *w, void *arg, int events)
} }
if (uev_io_init(ctx, &svc->notify_watcher, service_notify_cb, svc, sd, UEV_READ)) { if (uev_io_init(ctx, &svc->notify_watcher, service_notify_cb, svc, sd, UEV_READ)) {
err(1, "Falied initializing %s readiness notifier", svc_ident(svc, NULL, 0)); err(1, "Failed initializing %s readiness notifier", svc_ident(svc, NULL, 0));
break; break;
} }
return; /* Don't close sd, used for notify */ return; /* Don't close sd, used for notify */
+1 -1
View File
@@ -476,7 +476,7 @@ void cgroup_init(uev_ctx_t *ctx)
if (mount("none", FINIT_CGPATH, "cgroup2", opts, NULL)) { if (mount("none", FINIT_CGPATH, "cgroup2", opts, NULL)) {
if (errno == ENOENT) if (errno == ENOENT)
logit(LOG_INFO, "Kernel does not support cgroups v2, disabling."); logit(LOG_INFO, "Kernel does not support cgroups v2, disabling.");
else if (errno == EPERM) /* Probably inside an unpriviliged container */ else if (errno == EPERM) /* Probably inside an unprivileged container */
logit(LOG_INFO, "Not allowed to mount cgroups v2, disabling."); logit(LOG_INFO, "Not allowed to mount cgroups v2, disabling.");
else else
err(1, "Failed mounting cgroup v2"); err(1, "Failed mounting cgroup v2");
+1 -1
View File
@@ -113,7 +113,7 @@ static void cond_boot_strap(void)
* *
* => 'pid/' + 'teamd' + '' = condition <pid/teamd> * => 'pid/' + 'teamd' + '' = condition <pid/teamd>
* *
* When you add a second aggrate you need to tell Finit it's a different * When you add a second aggregate you need to tell Finit it's a different
* instance usugin the :ID syntax: * instance usugin the :ID syntax:
* *
* service :lag2 teamd -f /etc/teamd/lag2.conf -- Aggregate lag2 * service :lag2 teamd -f /etc/teamd/lag2.conf -- Aggregate lag2
+1 -1
View File
@@ -66,7 +66,7 @@ int prevlevel = -1;
int debug = 0; /* debug mode from kernel cmdline */ int debug = 0; /* debug mode from kernel cmdline */
int rescue = 0; /* rescue mode from kernel cmdline */ int rescue = 0; /* rescue mode from kernel cmdline */
int single = 0; /* single user mode from kernel cmdline */ int single = 0; /* single user mode from kernel cmdline */
int bootstrap = 1; /* set while bootrapping (for TTYs) */ int bootstrap = 1; /* set while bootstrapping (for TTYs) */
int kerndebug = 0; /* set if /proc/sys/kernel/printk > 7 */ int kerndebug = 0; /* set if /proc/sys/kernel/printk > 7 */
int syncsec = 0; /* reboot delay */ int syncsec = 0; /* reboot delay */
int readiness = SVC_NOTIFY_PID; int readiness = SVC_NOTIFY_PID;
+2 -2
View File
@@ -312,9 +312,9 @@ static int exec_login(char *name)
struct stat st; struct stat st;
if (passenv) if (passenv)
execl(_PATH_LOGIN, _PATH_LOGIN, "-p", name, NULL); execl(_PATH_LOGIN, _PATH_LOGIN, "-p", "--", name, NULL);
else else
execl(_PATH_LOGIN, _PATH_LOGIN, name, NULL); execl(_PATH_LOGIN, _PATH_LOGIN, "--", name, NULL);
/* /*
* Failed to exec login, should not happen on normal systems. * Failed to exec login, should not happen on normal systems.
+1 -1
View File
@@ -87,7 +87,7 @@ void console_init(void)
/* Enable line wrap, if disabled previously, e.g., qemu */ /* Enable line wrap, if disabled previously, e.g., qemu */
dprint(STDOUT_FILENO, "\033[?7h", 5); dprint(STDOUT_FILENO, "\033[?7h", 5);
/* Reset atttributes, background and foreground color */ /* Reset attributes, background and foreground color */
dprint(STDOUT_FILENO, "\033[49m\033[39m\e[2J", 14); dprint(STDOUT_FILENO, "\033[49m\033[39m\e[2J", 14);
log_init(); log_init();
+1 -1
View File
@@ -872,7 +872,7 @@ static char *svc_environ(svc_t *svc, char *buf, size_t len, int ansi)
{ {
int bold = missing(svc); int bold = missing(svc);
if (!ansi || svc_checkenv(svc) || svc->env[0] == '-') if (!ansi || svc_checkenv(svc))
bold = 0; bold = 0;
strlcpy(buf, bold ? "\e[1m" : "", len); strlcpy(buf, bold ? "\e[1m" : "", len);
+1 -1
View File
@@ -192,7 +192,7 @@ int pid_file_set(svc_t *svc, char *file, int not)
* pid:foo.tla --> /run/foo.tla.pid * pid:foo.tla --> /run/foo.tla.pid
* pid:/tmp/foo --> /tmp/foo.pid (Not handled by pidfile plugin!) * pid:/tmp/foo --> /tmp/foo.pid (Not handled by pidfile plugin!)
* *
* An exclamation mark, or logial NOT, in the first character position * An exclamation mark, or logical NOT, in the first character position
* indicates that Finit should *not* manage the PID file, and that the * indicates that Finit should *not* manage the PID file, and that the
* process uses a "non-standard" location. Eg. if service is 'bar' * process uses a "non-standard" location. Eg. if service is 'bar'
* Finit would assume the PID file is /run/bar.pid and the below simply * Finit would assume the PID file is /run/bar.pid and the below simply
+26 -10
View File
@@ -915,12 +915,12 @@ static void service_kill(svc_t *svc)
return; return;
} }
dbg("%s: Sending SIGKILL to process group %d", nm, svc->pid); dbg("%s: Sending SIGKILL to process %d", nm, svc->pid);
logit(LOG_CONSOLE | LOG_NOTICE, "Stopping %s[%d], sending SIGKILL ...", id, svc->pid); logit(LOG_CONSOLE | LOG_NOTICE, "Stopping %s[%d], sending SIGKILL ...", id, svc->pid);
if (runlevel != 1) if (runlevel != 1)
print_desc("Killing ", svc->desc); print_desc("Killing ", svc->desc);
kill(-svc->pid, SIGKILL); kill(svc->pid, SIGKILL);
/* Let SIGKILLs stand out, show result as [WARN] */ /* Let SIGKILLs stand out, show result as [WARN] */
if (runlevel != 1) if (runlevel != 1)
@@ -2147,13 +2147,16 @@ static void service_pre_script(svc_t *svc)
redirect(svc); redirect(svc);
/* Warning in service_start() after svc_checkenv() */
env_file = svc_getenv(svc); env_file = svc_getenv(svc);
if (env_file) if (env_file && fexist(env_file))
snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->pre_script); snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->pre_script);
else else
strlcpy(buf, svc->pre_script, sizeof(buf)); strlcpy(buf, svc->pre_script, sizeof(buf));
set_pre_post_envs(svc, "pre"); set_pre_post_envs(svc, "pre");
sig_unblock();
execvp(_PATH_BSHELL, argv); execvp(_PATH_BSHELL, argv);
_exit(EX_OSERR); _exit(EX_OSERR);
} }
@@ -2184,12 +2187,14 @@ static void service_post_script(svc_t *svc)
rc = WEXITSTATUS(svc->status); rc = WEXITSTATUS(svc->status);
sig = WTERMSIG(svc->status); sig = WTERMSIG(svc->status);
/* Warning in service_start() after svc_checkenv() */
env_file = svc_getenv(svc); env_file = svc_getenv(svc);
if (env_file) if (env_file && fexist(env_file))
snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->post_script); snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->post_script);
else else
strlcpy(buf, svc->post_script, sizeof(buf)); strlcpy(buf, svc->post_script, sizeof(buf));
set_pre_post_envs(svc, "post"); set_pre_post_envs(svc, "post");
sig_unblock();
if (WIFEXITED(svc->status)) { if (WIFEXITED(svc->status)) {
char val[4]; char val[4];
@@ -2214,7 +2219,7 @@ static void service_post_script(svc_t *svc)
} }
/* /*
* Unlike the pre: and post: scripts, the ready: script cannot re-use * Unlike the pre: and post: scripts, the ready: script cannot reuse
* svc->pid, so instead we use an assoc. list for matching any scripts * svc->pid, so instead we use an assoc. list for matching any scripts
* related to the svc, handled by service_script_add() below. When a * related to the svc, handled by service_script_add() below. When a
* ready: script is reaped the service_monitor() checks first for the * ready: script is reaped the service_monitor() checks first for the
@@ -2243,13 +2248,16 @@ void service_ready_script(svc_t *svc)
}; };
char *env_file; char *env_file;
/* Warning in service_start() after svc_checkenv() */
env_file = svc_getenv(svc); env_file = svc_getenv(svc);
if (env_file) if (env_file && fexist(env_file))
snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->ready_script); snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->ready_script);
else else
strlcpy(buf, svc->ready_script, sizeof(buf)); strlcpy(buf, svc->ready_script, sizeof(buf));
set_pre_post_envs(svc, "ready"); set_pre_post_envs(svc, "ready");
sig_unblock();
execvp(_PATH_BSHELL, argv); execvp(_PATH_BSHELL, argv);
_exit(EX_OSERR); _exit(EX_OSERR);
} }
@@ -2278,13 +2286,16 @@ static void service_cleanup_script(svc_t *svc)
redirect(svc); redirect(svc);
/* Warning in service_start() after svc_checkenv() */
env_file = svc_getenv(svc); env_file = svc_getenv(svc);
if (env_file) if (env_file && fexist(env_file))
snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->cleanup_script); snprintf(buf, sizeof(buf), ". %s; exec %s", env_file, svc->cleanup_script);
else else
strlcpy(buf, svc->cleanup_script, sizeof(buf)); strlcpy(buf, svc->cleanup_script, sizeof(buf));
set_pre_post_envs(svc, "cleanup"); set_pre_post_envs(svc, "cleanup");
sig_unblock();
execvp(_PATH_BSHELL, argv); execvp(_PATH_BSHELL, argv);
_exit(EX_OSERR); _exit(EX_OSERR);
} }
@@ -2480,9 +2491,9 @@ restart:
switch (svc->state) { switch (svc->state) {
case SVC_HALTED_STATE: case SVC_HALTED_STATE:
if (enabled) if (enabled) {
svc_set_state(svc, SVC_WAITING_STATE); svc_set_state(svc, SVC_WAITING_STATE);
else { } else {
if (svc_is_removed(svc)) { if (svc_is_removed(svc)) {
svc_set_state(svc, SVC_DEAD_STATE); svc_set_state(svc, SVC_DEAD_STATE);
} else if (svc_is_conflict(svc)) { } else if (svc_is_conflict(svc)) {
@@ -2567,6 +2578,11 @@ restart:
break; break;
case SVC_SETUP_STATE: case SVC_SETUP_STATE:
if (!enabled) {
service_stop(svc);
break;
}
if (!svc->pid) { if (!svc->pid) {
int rc = WEXITSTATUS(svc->status); int rc = WEXITSTATUS(svc->status);
int ok = WIFEXITED(svc->status); int ok = WIFEXITED(svc->status);
@@ -2940,7 +2956,7 @@ void service_notify_cb(uev_t *w, void *arg, int events)
* *
* This does not affect the restart_tot counter, which you can see in * This does not affect the restart_tot counter, which you can see in
* the output from 'initctl status foo', along with this instability * the output from 'initctl status foo', along with this instability
* "index" in parethesis: total (cnt/max) * "index" in parenthesis: total (cnt/max)
*/ */
static void service_interval_cb(uev_t *w, void *arg, int events) static void service_interval_cb(uev_t *w, void *arg, int events)
{ {
+1 -1
View File
@@ -243,7 +243,7 @@ restart:
/* Disable progress output at normal runtime */ /* Disable progress output at normal runtime */
enable_progress(0); enable_progress(0);
/* System bootrapped, launch TTYs et al */ /* System bootstrapped, launch TTYs et al */
bootstrap = 0; bootstrap = 0;
service_step_all(SVC_TYPE_RESPAWN); service_step_all(SVC_TYPE_RESPAWN);
sm->state = SM_RUNNING_STATE; sm->state = SM_RUNNING_STATE;
+2 -1
View File
@@ -148,7 +148,7 @@ typedef struct svc {
char cond[MAX_COND_LEN]; char cond[MAX_COND_LEN];
/* Instance specifics */ /* Instance specifics */
int job; /* For intenal use only, canonical ref is NAME:ID */ int job; /* For internal use only, canonical ref is NAME:ID */
char name[MAX_ARG_LEN]; char name[MAX_ARG_LEN];
char id[MAX_ID_LEN]; /* :ID */ char id[MAX_ID_LEN]; /* :ID */
char ifstmt[MAX_IDENT_LEN]; char ifstmt[MAX_IDENT_LEN];
@@ -286,6 +286,7 @@ static inline void svc_started (svc_t *svc) { if (svc) svc->starting = 0;
static inline int svc_is_starting (svc_t *svc) { return svc && 0 != svc->starting; } static inline int svc_is_starting (svc_t *svc) { return svc && 0 != svc->starting; }
static inline int svc_is_running (svc_t *svc) { return svc && svc->state == SVC_RUNNING_STATE; } static inline int svc_is_running (svc_t *svc) { return svc && svc->state == SVC_RUNNING_STATE; }
static inline int svc_is_stopping (svc_t *svc) { return svc && svc->state == SVC_STOPPING_STATE; } static inline int svc_is_stopping (svc_t *svc) { return svc && svc->state == SVC_STOPPING_STATE; }
static inline int svc_is_stopped (svc_t *svc) { return svc && svc->block == SVC_BLOCK_USER; }
static inline int svc_is_removed (svc_t *svc) { return svc && svc->removed; } static inline int svc_is_removed (svc_t *svc) { return svc && svc->removed; }
static inline int svc_is_changed (svc_t *svc) { return svc && 0 != svc->dirty; } static inline int svc_is_changed (svc_t *svc) { return svc && 0 != svc->dirty; }
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
# Verify handling of dependant services, bug #314 # Verify handling of dependent services, bug #314
# Two services: foo and bar, where bar depends on foo: # Two services: foo and bar, where bar depends on foo:
# #
# - bar must not start until foo is ready # - bar must not start until foo is ready
+1 -1
View File
@@ -71,7 +71,7 @@ test_one()
assert_status "serv" "running" assert_status "serv" "running"
assert_cond "service/serv/ready" assert_cond "service/serv/ready"
# Issue #343; pidfile.so inadvertedly marked systemd services as # Issue #343; pidfile.so inadvertently marked systemd services as
# 'started' when they created their PID file. The serv test daemon # 'started' when they created their PID file. The serv test daemon
# waits 3 sec between pidfile and notify to trigger this bug. # waits 3 sec between pidfile and notify to trigger this bug.
if [ "$type" != "pid" ]; then if [ "$type" != "pid" ]; then
+1 -1
View File
@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# #
# Verifies that a run task can call initctl at bootstrap and runlevel 2, # Verifies that a run task can call initctl at bootstrap and runlevel 2,
# without blocking, performing serveral tasks: # without blocking, performing several tasks:
# #
# 1. Query running services # 1. Query running services
# 2. Stop/Start a running service # 2. Stop/Start a running service