Files
finit/doc/config/task-and-run.md
T
Joachim Wiberg b9ad9bcb21 doc: convert the documentation to the block format
The syntax overview no longer describes a line-based format, since that
is not what the rest of the documentation shows.  It now covers the
grammar, the two naming conventions, the nine aliases, and the leading
'-' on a path, and it says plainly that both formats are still read and
told apart per file by content.  Without that, a reader with an
existing configuration is left wondering what happened to it.

service-opts.md was a list of modifiers to place between a directive
and its command, so it needed rewriting rather than translating: there
are no positions left to describe.  It is now grouped by what the
settings do.

conditions.md needed correcting.  It presented '!' as a condition
prefix alongside '~'.  It is neither a condition nor a negation, it is
a flag on the block that means one thing on a service and another on a
run or task, so it is spelled reload-signal and required here, and the
page maps the old form to both.

Two things the pages claimed are not true.  The kill delay range is
1-300, not 1-60, and stop and reload scripts are no longer run without
a timeout.

ChangeLog.md keeps its line-based examples.  Those sit in historical
release entries, and rewriting them in a syntax that did not exist at
the time would misdate the format.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2026-07-30 15:21:31 +02:00

3.1 KiB

run (sequence)

Syntax: run [LVLS] <COND> /path/to/cmd ARGS -- Optional description

<COND> is described in the Services section.

One-shot command to run in sequence when entering a runlevel, with optional arguments and description. run commands are guaranteed to be completed before running the next command. Useful when serialization is required.

Warning

Try to avoid the run command. It blocks much of the functionality in Finit, like (re)starting other (perhaps crashing) services while a run task is executing. Use other synchronization mechanisms instead, like conditions.

Incomplete list of unsupported initctl commands in run tasks:

  • initctl runlevel N, setting runlevel
  • initctl reboot
  • initctl halt
  • initctl poweroff
  • initctl suspend

To prevent initctl from calling Finit when enabling and disabling services from inside a run task, use the --force option. See also the --quiet and --batch options.

task (parallel)

Syntax: task [LVLS] <COND> /path/to/cmd ARGS -- Optional description

<COND> is described in the Services section.

One-shot like 'run', but starts in parallel with the next command.

Both run and task commands are run in a shell, so basic pipes and redirects can be used:

task bar {
    runlevel = "S"
    command  = "echo \"foo\" | cat >/tmp/bar"
}

Please note, ;, &&, ||, and similar are not supported. Any non-trivial constructs are better placed in a separate shell script.

remain-after-exit

By default, a run or task will re-run each time its runlevel is entered, and its exec-stop-post script does not run on completion.

With remain-after-exit, the task runs once and does not re-run on runlevel re-entry:

task firewall {
    description       = "Firewall setup"
    runlevel          = "2345"
    remain-after-exit = true
    command           = "/usr/sbin/setup-firewall"
}

This has the following effects:

  • The task does not re-run on runlevel re-entry
  • The exec-stop-post script runs when:
    • The task is explicitly stopped (initctl stop NAME)
    • The task leaves its valid runlevels (e.g., runlevel change)

This is useful for tasks that set up persistent state where:

  • Cleanup should only happen on explicit stop or when leaving valid runlevels
  • The setup should not be re-run on every runlevel entry

Example: Setting up firewall rules with cleanup on shutdown:

task firewall {
    description       = "Firewall setup"
    runlevel          = "2345"
    remain-after-exit = true
    exec-stop-post    = "/usr/sbin/teardown-firewall"
    command           = "/usr/sbin/setup-firewall"
}

The firewall rules are created once. The exec-stop-post script runs when entering runlevel 0 (halt) or 6 (reboot), or on explicit stop.

Note

The remain:yes option is not supported for bootstrap-only tasks (tasks with only runlevel S). Bootstrap tasks are deleted immediately after completion, and their post: scripts never run. A warning is logged if remain:yes is used on such tasks.