[Це безпосередньо не стосується проблеми systemd-tmpfiles, але я думаю, ви вже визнали, що в цьому конкретному випадку вам краще просто використовувати ехо.]
По-перше, "multi-user.target" може бути, а не бути тим, що ви хочете використовувати. Якщо ви знайомі з концепцією пробігу в стилі SysV init речі, багатокористувацький - це системний еквівалент runlevel 3, що є багатокористувацькою системою, яка завантажується на консоль, а не GUI. Еквівалент runlevel 5, який завантажується в X, є graphic.target . За замовчуванням визначається символьне посилання в /etc/systemd/system
(і / або /lib/systemd/system
; те /etc
, що перевершить це в /lib
), зване default.target , використовуйте ls, щоб знайти, де воно вказує:
»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target
Для звичайних робочих столів Linux це буде graphical.target. Це насправді не важливо, якщо ви хочете, щоб послуга завантаження, яку ви створюєте, почалася незалежно від того, що таке рівень запуску / ціль за замовчуванням - у цьому випадку ми можемо просто використовувати default.target, і не хвилюватися, для чого це псевдонім. Якщо ви використовуєте багатокористувацьку, а ваш замовчуванням є графічний, ваша послуга не відбудеться.
Залежно від послуги, можуть бути більш відповідні та конкретні цілі або послуги, з яких ви хочете розпочати цю. Виходячи з вашого іншого питання, default.target, ймовірно, добре. Як зауваження, різниця між "ціллю" та "послугою" полягає в тому, що служба містить [Service]
розділ, який фактично запускає процес; ціль - це лише спосіб групування послуг разом за різними директивами "залежить" і "вимагає"; він не робить нічого власного, окрім як викликати інші цілі чи послуги.
Коли служба запускається, визначається, які інші послуги явно від неї залежать. У випадку простого, окремого подібного події, як цей, який ми хочемо запустити до кінця в процесі завантаження, ми можемо використовувати цю комбінацію директив:
[Unit]
After=default.target
[Install]
WantedBy=default.target
Розділ «Встановити» використовується під час встановлення послуги; "WantedBy" вказує ціль, з якою ми хочемо включити цю послугу (це означає, що вона буде запущена, якщо така ціль є, але nb. Це не визначає, коли вона запускатиметься стосовно інших ). Оскільки ми насправді хочемо, щоб ця послуга запускалася пізніше, ніж швидше, тоді ми визначаємо пункт "Після". Це насправді не повинно бути таким же, як ціль WantedBy (зазвичай це не так) і може бути повністю опущено, якщо вам не байдуже, коли це станеться; Я просто використовую це на думку про те, що більшість інших матеріалів буде запущено стосовно речей, які десь приковані до чогось визначеного Before=default.target
(що ми також могли б використати; бажання цілі оцінюються до запуску цілі).
Для прикладу я просто відлуню "привіт світ" до консолі. Сама послуга описана в [Service]
розділі:
[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld
Команді потрібен повний шлях. Причиною, яку я не просто скористався, /usr/bin/echo "hello world"
є те, що він не працюватиме (я думаю, що результат іде на / dev / null, я думаю), і хоча служба, яка виконує echo "hello world" > /dev/console
заповіт, експериментування демонструє, що використання перенаправлення оболонки в директиві ExecStart не буде . Так / USR / місцеві / бен / HelloWorld це сценарій оболонки з цієї одного рядка, echo "hello world" > /dev/console
.
Зауважте Type=forking
, що необхідно для сценарію оболонки.
Наш повний, мінімальний файл обслуговування тільки ці три секції ( [Unit]
, [Service]
і [Install]
). Щоб встановити, розмістіть файл або символьне посилання на нього в / etc / systemd / system або / usr / lib / systemd / system, і:
systemctl --system enable helloworld
Він повинен надрукувати ln -s ...
. Це не запускає службу, вона просто налаштовує її на запуск при завантаженні, як обговорювалося вище.
Ось у двох словах. man systemd.unit
і man systemd.service
більше деталей.