Может ли кто-нибудь привести пример юнит-файла в состоянии «псевдоним»?

В документах говорится: «Имя является псевдонимом (символическая ссылка на другой файл модуля)».

Однако, насколько я понимаю, если файл модуля не включен и является символической ссылкой, это либо символическая ссылка на файл за пределами досягаемости systemd (и, следовательно, в состоянии «связан»), либо символическая ссылка на файл внутри systemdreach (и, следовательно, в состоянии «косвенный»).

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным, скажем, у меня есть этот пример службы:

$ cat myservice.sh 
while true
do
echo "Looping"
sleep 30
done

И юнит-файл:

$ cat myservice.service
[Unit]
Description=Example Service.

[Service]
Type=simple
ExecStart=/bin/bash ~/myservice.sh

[Install]
WantedBy=multi-user.target

Что мне делать, если я хочу создать псевдоним myservice.service, то есть единицу myalias.service -> myservice.service, такую, что вывод systemctl is-enabled myalias равен alias?

0
Jorge Lopez 22 Авг 2020 в 10:43

1 ответ

systemd.special(7) перечисляет несколько единиц, которые должны иметь псевдоним .

Один пример из справочной страницы:

   default.target
      The default unit systemd starts at bootup. Usually, this should be
      aliased (symlinked) to multi-user.target or graphical.target. See
      bootup(7) for more discussion.

      The default unit systemd starts at bootup can be overridden with the 
      systemd.unit= kernel command line option, or more conveniently, with 
      the short names like single, rescue, 1, 3, 5, ...; see systemd(1).

Если я проверю файл модуля при тестировании Debian, я увижу:

$ systemctl cat default.target
# /lib/systemd/system/graphical.target
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes

$ systemctl status default.target
● graphical.target - Graphical Interface
     Loaded: loaded (/lib/systemd/system/graphical.target; static)
     Active: active since Tue 2020-08-18 08:01:45 CEST; 4 days ago
       Docs: man:systemd.special(7)

Aug 18 08:01:45 stewbian systemd[1]: Reached target Graphical Interface.

$ systemctl is-enabled default.target
alias

Если мы хотим увидеть другие псевдонимы псевдонимов, мы можем ls каталог и grep все ссылки, которые не являются масками:

$ ls -l /lib/systemd/system/ | grep -e '^l' | grep -v '/dev/null'
lrwxrwxrwx autovt@.service -> getty@.service
lrwxrwxrwx ctrl-alt-del.target -> reboot.target
lrwxrwxrwx dbus-org.freedesktop.hostname1.service -> systemd-hostnamed.service
lrwxrwxrwx dbus-org.freedesktop.locale1.service -> systemd-localed.service
lrwxrwxrwx dbus-org.freedesktop.login1.service -> systemd-logind.service
lrwxrwxrwx dbus-org.freedesktop.timedate1.service -> systemd-timedated.service
lrwxrwxrwx default.target -> graphical.target
lrwxrwxrwx gdm3.service -> gdm.service
lrwxrwxrwx kmod.service -> systemd-modules-load.service
lrwxrwxrwx plymouth-log.service -> plymouth-read-write.service
lrwxrwxrwx plymouth.service -> plymouth-quit.service
lrwxrwxrwx procps.service -> systemd-sysctl.service
lrwxrwxrwx runlevel0.target -> poweroff.target
lrwxrwxrwx runlevel1.target -> rescue.target
lrwxrwxrwx runlevel2.target -> multi-user.target
lrwxrwxrwx runlevel3.target -> multi-user.target
lrwxrwxrwx runlevel4.target -> multi-user.target
lrwxrwxrwx runlevel5.target -> graphical.target
lrwxrwxrwx runlevel6.target -> reboot.target
lrwxrwxrwx speech-dispatcher.service -> speech-dispatcherd.service
lrwxrwxrwx udev.service -> systemd-udevd.service

Единственный пример на моей машине службы, которая не является статической, это speech-dispatcher.service:

$ systemctl is-enabled speech-dispatcher.service
alias
$ systemctl status speech-dispatcher.service
● speech-dispatcherd.service - Speech-Dispatcher, common interface to speech synthesizers
     Loaded: loaded (/lib/systemd/system/speech-dispatcherd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)

Вы заметите, что он отключен. Если я включу его, я получаю:

$ systemctl enable speech-dispatcher.service
Synchronizing state of speech-dispatcher.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable speech-dispatcher
Created symlink /etc/systemd/system/speech-dispatcher.service → /lib/systemd/system/speech-dispatcherd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/speech-dispatcherd.service → /lib/systemd/system/speech-dispatcherd.service.

$ systemctl status speech-dispatcher.service
● speech-dispatcherd.service - Speech-Dispatcher, common interface to speech synthesizers
     Loaded: loaded (/lib/systemd/system/speech-dispatcherd.service; enabled; vendor preset: enabled)
     Active: inactive (dead)

stew ~ $ systemctl is-enabled speech-dispatcher.service
alias
0
Stewart 22 Авг 2020 в 10:05
Но если я сделаю systemctl is-enabled default.target, я получу static. Мне нужен пример, в котором вывод этой команды был alias.
 – 
Jorge Lopez
22 Авг 2020 в 09:52
В ответе выше вы также можете увидеть gdm3.service -> gdm.service. Если я systemctl is-enabled gdm3.service, я получаю alias. Будет редактировать ответ
 – 
Stewart
22 Авг 2020 в 09:55
Из systemctl is-enabled procps.service я получаю static. А из ls... я получаю procps.service -> systemd-sysctl.service. На самом деле я получаю static или disabled из большинства символических ссылок, я не понимаю...
 – 
Jorge Lopez
22 Авг 2020 в 10:09
В этом случае большинство ваших блоков символических ссылок статичны или отключены. Попробуйте включить один, чтобы увидеть, на что это похоже. Я обновил ответ, указав единственный нестатический блок на моей машине.
 – 
Stewart
22 Авг 2020 в 10:11
У меня было smartmontools.service в состоянии disabled, но после systemctl enable smartmontools состояние стало enabled. Я практически перепробовал все символические ссылки в своей системе, результат либо static, либо indirect, либо enabled, либо disabled (которые становятся enabled). Я отредактировал вопрос, если я хочу сделать свой пример alias, что мне делать?
 – 
Jorge Lopez
22 Авг 2020 в 10:44