LINUX.ORG.RU

Как добавить сервис в автозагрузку?

 , ,


0

1

Привет, друзья! Я привык добавлять сервисы в автозагрузку с помощью /etc/xdg/autostart. А в GNOME потом можно ставить и убирать галочки, какие стартовать, а какие - нет.

А как сделать то же самое в системе, в которой только консоль? Только init-скрипты, и по-другому никак?

Если да, не могли бы вы мне показать пример простого скрипта для sysvinit, upstart и systemd, который тупо запускает «someapp»

Ответ на: комментарий от droserasprout

Искал. Выдаёт общую информацию о том, что такое Runlevels. Вот тут вроде удача, но это rc.d скрипты

ZenitharChampion ★★★★★
() автор топика

systemd

/etc/systemd/system/любое_имя.service:

[Service]
Type=<смотри ниже>
ExecStart=/path/to/someapp

[Install]
WantedBy=multi-user.target

Type= указывает, уходит ли твой процесс в фон. Возможные значения:

  • simple: процесс не уходит в фон, его можно считать запустившимся сразу после fork+exec;
  • forking: процесс уходит в фон, его нужно считать запустившимся только после завершения исходного процесса;
  • oneshot: процесс представляет собой однократную задачу (например, mandb), которую нужно считать выполненной только после завершения исходного процесса.
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от ZenitharChampion

Сюда:

/etc/systemd/system/любое_имя.service

Если ты создаёшь пакет — то в /usr/lib (или просто в /lib, зависит от дистрибутива). Если ты пишешь юнит для локального использования, то в /etc.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от Radjah

Алсо, вместо systemctl enable && systemctl start можно использовать ключ --now, очень удобно.

droserasprout ★★
()
Ответ на: комментарий от intelfx

Ну можно же еще указать полный путь к юниту, тогда systemctl замутит симлинки в нужных местах. Я так для самосборных говен делал.

Radjah ★★★★★
()
Ответ на: комментарий от Radjah

Верно, enable умеет принимать полный путь к юниту, лежащему чёрт-те где. Но enable и/или start в любом случае делается вручную.

intelfx ★★★★★
()
Ответ на: комментарий от ZenitharChampion

0_o, зачем и как? Да и невозможно это в общем случае.

sysvinit-скрипт — это исполняемый код. Есть два варианта: либо разобраться в коде и написать эквивалентный юнит вручную, либо просто запускать из юнита уже имеющийся скрипт:

[Service]
Type=forking
ExecStart=/etc/init.d/someapp start

# если инитскрипт по "stop" просто прибивает процесс демона,
# то следующую строчку можно не писать — systemd сам умеет
# прибивать процессы и делает это лучше, чем средний инитскрипт
#ExecStop=/etc/init.d/someapp stop

Обратно в общем случае тоже невозможно. Допустим, если демон не оставляет после себя PID-файл, то как ты прибьёшь его из инитскрипта? А systemd такое умеет. Поэтому тут тоже нужна ручная работа.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

От юзера так:

systemctl --user enable name.service

А есть онлайн-конвертер скриптов Sysvinit в Systemd и наоборот?

В большинстве случаев не нужно sd обратно совместим с init скриптами, через systemd-sysv-generator.

anonymous_sama ★★★★★
()
5 ноября 2016 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.