LINUX.ORG.RU
ФорумTalks

Нейтральный пофигист сколоняется к ненависти

 


0

2

В Debian приехал systemd, а у меня есть демон, который хотелось бы подгружать при старте системы. Ну, думаю, надо потратить пару минут — там же всё просто?
Увы. Это мало того что не просто — взять пример и изменить под свои нужды сложнее, чем раньше, поскольку конфиг содержит (а любой взятый пример их обычно ещё и НЕ содержит и надо думать не только о нужном значении, но и о том какие параметры вообще есть)множество systemd-специфичных вещей, которые здравым смыслом не осиливаются. Но это всё мелочи.
Задача: Есть демон. Демону нужен файл. Пусть к файлу внутри демона прописан просто как «file.dat». Следовательно для корректного запуска мне нужно перейти в директорию с демоном и там его запустить.
Как добиться такого же поведения от systemd я не понял. Разумеется он это может, но вычитывать мегабайты несуществующей документации ради одноразовой элементарной задачи мне не интересно. Мне проще изменить демон так, чтобы он принимал в качестве параметра абсолютный путь к нужным ему файлам.
Вот этим я сейчас и займусь.

★★☆

Запили враппер на баше, проблема, что ли. Я так всегда делаю, когда нужно шастать по конкретным каталогам, но запускать из .desktop-ярлыка, к примеру.

border-radius
()
Ответ на: комментарий от gh0stwizard

Я этой дряни уже начитался. Больше не хочу. Системд жрёт всегда абсолютные пути и если я сделаю так:

[Service]
Type=oneshot
ExecStart= /bin/sh -c 'cd /path/daemon.dir'; /path/daemon.dir/daemon -d
То мне это никак не помогает. Демон не находит файл.

все просто

Угу. У меня сложилось впечатление, что там как в винде — типовые задачи решаются движением пальца, а чуть шаг в сторону...

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

Эммм. Ну, как так можно читать доки!

ExecStartPre=, ExecStartPost=

    Additional commands that are executed before or after the command in ExecStart=, respectively. Syntax is the same as for ExecStart=, except that multiple command lines are allowed and the commands are executed one after the other, serially.

    If any of those commands (not prefixed with "-") fail, the rest are not executed and the unit is considered failed.

http://www.freedesktop.org/software/systemd/man/systemd.service.html

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

И вдобавок:

WorkingDirectory=

    Takes an absolute directory path. Sets the working directory for executed processes. If not set, defaults to the root directory when systemd is running as a system instance and the respective user's home directory if run as user.

http://www.freedesktop.org/software/systemd/man/systemd.exec.html

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

/bin/sh -c 'cd /path/daemon.dir'; /path/daemon.dir/daemon -d

sh, перешедший в /path/daemon.dir, завершается, и мы остаёмся в /. Нужно: /bin/sh -c 'cd /path/daemon.dir && exec ./daemon -d'.

А правильный ответ уже дали выше.

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

WorkingDirectory=

О, так там и такое есть, ну, тогда можно и без враппера обойтись.

border-radius
()
Ответ на: комментарий от AITap

Раз уж ты в таких штуках шаришь, то подскажи такую вещь, почему при старте systemd нихрена не делает, но если сказать systemctl start fabella, то запускает и всё нормально? Полный код конфига:

[Unit]
Description=Enable Fabella Daemon

[Service]
Type=oneshot
ExecStart= /bin/sh -c 'cd /internet/fabella.info && exec ./fabellas -d'

[Install]
WantedBy=default.target



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

systemd не пользуюсь, просто ошибку в команде заметил.

Может быть, нужно сделать systemctl enable fabella?

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

enable

Ага, оно.

В общем мой вердикт — неочевидное и переусложнённое. Возможно при некоторых обстоятельствах есть какой-то профит, но для меня это пока просто очередная хрень, с которой придётся «бодаться» при каждой встрече.

Stahl ★★☆
() автор топика

В Debian приехал systemd

А что, init уже все, кончился? Или нахрена эту гадость ставить?

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

Вот лично для меня профита много. Т. е. я бы сейчас не перешёл добровольно на такую ОС, где нет systemd.

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

Ха, я пробовал. Работал один лишь oneshot — другие не запускались с какой-то ошибкой. Уже не помню и повторять не буду. Что-то по поводу нескольких команд в Exec. Или что-то в этом роде.

В общем так — работает и ладно. Настройка конфигов это не моя специализация и лезть сверх необходимого в это дело я не хочу.

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

Всё-таки сделай как надо. Ещё одна злобная тема через месяц с содержанием «почему системд не работает при кривом конфиге, уроды проклятые» не нужна.

Я даже перепишу юнит за тебя.

[Unit]
Description=Fabella Daemon
Wants=network.target
After=network.target

[Service]
Type=forking
WorkingDirectory=/internet/fabella.info
ExecStart=/internet/fabella.info/fabellas -d

[Install]
WantedBy=multi-user.target

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

Если оставить oneshot, то с точки зрения systemd загрузка системы никогда не завершится. То есть, не будут работать такие вещи, как systemd-analyze. Даже getty в виртуальных терминалах могут не запуститься, потому что они имеют тип idle (т. е. запускать только когда всё остальное стартанёт).

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

А ошибка могла быть в том, что в случае Type!=oneshot не может быть больше одной директивы ExecStart=, т. к. не понятно, какую из них считать «главной» и какой процесс считать основным процессом демона.

Для таких вещей, как «подготовительные работы» до запуска демона, есть ExecStartPre=, которая может повторяться сколько угодно раз и выполняется синхронно (строчка за строчкой). Но тебе эта директива здесь не нужна. Всё решается с помощью WorkingDirectory= и ExecStart=.

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

А так можно? Я pwd использовал лишь для того чтобы узнать где я... Ман ничего не знает. Ты не путаешь?

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

Конечно можно (если конечно сам системы не заигнорит подобную комстроку). Рабочая дира это всего лишь переменная окружения.

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

А мне кажется, что rc-update add fabella default в сотни раз малоочевидней и сложнее, для человека, не знакомого с этим.

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

Блин. Ну какого же хрена?! Смотри какая штука странная. Демон запускается, но через минуты две тухнет:

root@pozitron:/etc/systemd/system# systemctl status fabella
fabella.service - Fabella Daemon
   Loaded: loaded (/etc/systemd/system/fabella.service; enabled)
   Active: failed (Result: timeout) since Суб 2014-08-16 11:45:52 EEST; 38s ago
  Process: 781 ExecStart=/internet/fabella.info/fabellas -d (code=killed, signal=TERM)

Авг 16 11:44:22 pozitron systemd[1]: Starting Fabella Daemon...
Авг 16 11:45:52 pozitron systemd[1]: fabella.service operation timed out. Terminating.
Авг 16 11:45:52 pozitron systemd[1]: Failed to start Fabella Daemon.
Авг 16 11:45:52 pozitron systemd[1]: Unit fabella.service entered failed state.
Что не так теперь? Какой ещё таймаут?!

Stahl ★★☆
() автор топика

Вообще это дурная практика. Надо править код демона, чтобы мог работать из корня как и любой нормальный демон.

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

в случае Type!=oneshot не может быть больше одной директивы ExecStart=

И не может быть больше одной команды в директиве ExecStart. ТС сначала накосячил в команде — /bin/sh -c 'cd /path/daemon.dir'; /path/daemon.dir/daemon -d (предложенное выше /bin/sh -c 'cd /path/daemon.dir && exec ./daemon -d' вполне правильно сработало бы с Type=simple), а потом, вместо исправления ошибки, накосячил второй раз в типе сервиса.

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

Так. Если он форкается (т. е., если запускать из консоли, управление мгновенно возвращается) — то что-то не так и ты, скорее всего, не перезагрузил конфиги (systemctl daemon-reload; systemctl restart fabella).

Если всё же не форкается — то нужно Type=simple.

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

Информация к размышлению если запускать просто fabellas -d, то управление возвращается сразу, как и задумано, а если через systemctl start fabella то управление не возвращается

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

Воот. Значит, systemd ждёт окончания запуска демона.

А... ты уверен, что правильно форкаешься? (насколько понимаю, демон твой, самописный)

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от border-radius

Лол.
Диалог Раз:
- Чем плохо не-systemd?
- Там скрипты на баше.
Диалог Два:
- У меня теперь системд, не работает %XYZ%.
- Запили скрипт на баше.


Самим не смешно, друзья?

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

Нет, т. к. в случае sysvinit на баше написано всё, а в случае systemd — только точечный костыль для конкретного демона.

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

Ну, ок. Сейчас и ключ уберу.

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

Если с ключом -d и Type=simple работает (и не таймаутится после 90 секунд) — значит, ты точно неправильно форкаешься.

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

Ok. Пока всё работает в штатном режиме.
Вот видишь — переусложнённый и нелогичный этот твой системд.
Ведь строго говоря — сейчас конфиг делает не то, что надо, а то, что получилось. А вот не оказалось бы у меня возможности не форкаться и что? Незачёт.

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

Т.е. всем хорошо. Операционка кушает, а вот для системд что-то неправильно? Я тебя правильно понимаю?

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