wiki/linux.systemd.services.org

93 lines
3.5 KiB
Org Mode
Raw Normal View History

2022-07-29 15:41:17 +00:00
:PROPERTIES:
:ID: cd5f0d04-d9bb-44e8-a0f2-630ea58c1e94
:END:
#+title: systemd services
#+date: 2021-07-19 21:46:52 +08:00
#+date_modified: 2021-08-02 11:56:12 +08:00
#+language: en
One of the functions of the system suite is service management.
Like most of the components, it can be used at user-level with their set locations, managing the service daemon, and all.
* Service management basics
Just plop down a service unit file at one of the search paths and you can start managing right away.
For more information, see the manual page (i.e., =systemd.service.5=).
A summarized version can be found at [[Service configuration]].
Here's an example of a user service resided as =$HOME/.config/systemd/user/drive-backup.service=.
#+begin_src ini
[Unit]
Description=Periodic safety backup for my external drive
Documentation=man:borg(1) https://www.borgbackup.org/ https://torsion.org/borgmatic/
[Service]
Type=oneshot
ExecStart=%h/.nix-profile/bin/borgmatic --config %h/dotfiles/borgmatic/personal-drive.yaml --verbosity 2 create
ExecStart=%h/.nix-profile/bin/borgmatic --config %h/dotfiles/borgmatic/personal-drive.yaml --verbosity 2 prune
ExecStart=%h/.nix-profile/bin/borgmatic --config %h/dotfiles/borgmatic/personal-drive.yaml --verbosity 2 check
[Install]
WantedBy=default.target
#+end_src
You can then start the service with:
#+begin_src shell :eval no
systemctl --user start drive-backup.service
#+end_src
You can also stop it with the =stop= subcommand (e.g., ~systemctl --user stop drive-backup.service~) and restart it with =restart= (e.g., ~systemctl --user restart drive-backup.service~).
If you want to enable it at startup, you can go with =enable= subcommand.
(To disable it, use the =disable= subcommand.)
#+begin_src shell :eval no
systemctl --user enable drive-backup.service
#+end_src
systemd will use the configuration file as-is by the time it is started/enabled.
Which means if the config file has been modified after activation, it will not take effect until you restarted it.
For this, you can reload the daemon with =daemon-reload= subcommand.
But for simpler cases, you can use the =reload= subcommand without fully restarting the daemon.
#+begin_src shell :eval no
systemctl --user reload drive-backup.service
# You could also use...
# systemctl --user daemon-reload
# ...if you need a stronger option.
#+end_src
* Service configuration
There are different types of services.
- The most common type of service is =simple= which considers the unit active after the main process is forked (e.g., =Service.ExecStart=).
This is the recommended type for long-running processes.
- =oneshot= marks the service resolved after the main process exits.
Due to the behavior, it will directly go from activating to deactivating instead of active.
- =exec= considers the service active after the binary has been executed.
Aside from types, each service may have one or more commands although the behavior is set depending on the type.
- =ExecStart= which is usually the main command and most services will throw an error if it's missing.
All services, unless specified as a =oneshot= service, only have one of these values.
- =ExecStop= only executes after the main command successfully starts.
- =ExecStartPre= and =ExecStartPost= gives you additional commands that will be executed before and after the main command, respectively.
- =ExecStopPre= and =ExecStopPost= is similar to the pre- and post-start commands except for the stop command.
- =Reload= sets whether the service restarts on fail.
Values accepted are =no=, =on-failure=, and =on-success=.