LINUX.ORG.RU
решено ФорумAdmin

Демону не передаются аргументы командной строки

 


0

1

Собрал из исходников себе пакетик с gearmand-1.1.2

Написал для него unit такого вида:

[Unit]
Description=gearman job control server

[Service]
EnvironmentFile=/etc/default/gearmand
ExecStartPre=/usr/bin/install -d -o gearman /run/gearman
PermissionsStartOnly=true
User=gearman
PIDFile=/run/gearman/server.pid
ExecStart=/usr/sbin/gearmand ${PARAMS} 

[Install]
WantedBy=multi-user.target

В /etc/default/gearmand прописал все необходимые параметры:

PARAMS="--listen=127.0.0.1 \
--pid-file=/run/gearman/server.pid \
--log-file=/var/log/gearman-job-server/gearman.log \
--queue-type=postgres \
--libpq-conninfo='host=localhost user=gearman password=password dbname=gearman' \
--libpq-table=queue \
--daemon"

Активировал всё это дело с помощью systemctl enable gearmand.service

Запускаю systemctl start gearmand.service, всё вроде бы как запустилось, но в статусе пишет предупреждение

● gearmand.service - gearman job control server
   Loaded: loaded (/etc/systemd/system/gearmand.service; enabled)
   Active: active (running) since Thu 2015-10-15 11:12:30 UTC; 4s ago
  Process: 14595 ExecStartPre=/usr/bin/install -d -o gearman /run/gearman (code=exited, status=0/SUCCESS)
 Main PID: 14598 (gearmand)
   CGroup: /system.slice/gearmand.service
           └─14598 /usr/sbin/gearmand --listen=127.0.0.1 --pid-file=/run/gearman/server.pid --log-file=/var/log/gearman-job-server/gearman.log --queue-type=postgres --libpq-conninfo='host=localhost user=gearman password=password...

Oct 15 11:12:29 giveya.com systemd[1]: Starting gearman job control server...
Oct 15 11:12:30 giveya.com systemd[1]: Started gearman job control server.
Oct 15 11:12:30 giveya.com gearmand[14598]: /usr/sbin/gearmand: Could not open log file "/usr/var/log/gearmand.log", from "/", switching to stderr. (No such file or directory)

Т.е. демон пытается запуститься с дефолтными параметрами, игнорируя все опции командной строки, хотя в ps пишет, что опции были переданы

# ps waux | grep [g]earman
gearman  14598  0.0  0.1 451188  5872 ?        Ssl  11:12   0:00 /usr/sbin/gearmand --listen=127.0.0.1 --pid-file=/run/gearman/server.pid --log-file=/var/log/gearman-job-server/gearman.log --queue-type=postgres --libpq-conninfo='host=localhost user=gearman password=password dbname=gearman' --libpq-table=queue --daemon

Однако lsof явно показывает, что логи не открылись где надо и в /run никаких pid-файлов не создалось.

Я подумал было, что сам gearmand глючит, но если со всеми моими опциями запустить его ручками из консоли, он запускается нормально, логи и пиды создаются, в lsof видно, что демон приконнектился к постгресу.

# ps waux | grep [g]earman
root     14662  0.0  0.1 459732  6708 ?        Ssl  11:22   0:00 /usr/sbin/gearmand --listen=127.0.0.1 --pid-file=/run/gearman/server.pid --log-file=/var/log/gearman-job-server/gearman.log --queue-type=postgres --libpq-conninfo=host=localhost user=gearman password=password dbname=gearman --libpq-table=queue --daemon
postgres 14663  0.0  0.3 228564 14740 ?        Ss   11:22   0:00 postgres: gearman gearman 172.30.0.166(35460) idle 
# lsof -n | grep gearman | grep -E '(var|postgr)' | head -n 2
gearmand  14662           root    4w      REG              202,1        0     395116 /var/log/gearman-job-server/gearman.log
gearmand  14662           root    5u     IPv4              42645      0t0        TCP 127.0.0.1:35460->127.0.0.1:postgresql (ESTABLISHED)

Почему опции не отработали через systemd? Хочется сделать всё нормально через юнит, а не добавлять команду запуска gearmand'а тупо в rc.local.

systemd.service(5):

Basic environment variable substitution is supported. Use «${FOO}» as part of a word, or as a word of its own, on the command line, in which case it will be replaced by the value of the environment variable including all whitespace it contains, resulting in a single argument. Use «$FOO» as a separate word on the command line, in which case it will be replaced by the value of the environment variable split at whitespace resulting in zero or more arguments. For this type of expansion, quotes are respected when splitting into words, and afterwards removed.

Другими словами, поскольку ты написал ${PARAMS}, вся командная строка передалась демону как один аргумент. Убери фигурные скобки (а также кавычки из /etc/default/gearmand).

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

Ага. Этот момент я упустил.

Твой вариант не сработал. Оно воспринимало user=gearman как отдельную опцию, а не как часть опции --libpq-conninfo.

Поэкспериментировал с разными вариантами и в итоге пришёл к такому:

[Unit]
Description=gearman job control server

[Service]
EnvironmentFile=/etc/default/gearmand
ExecStartPre=/usr/bin/install -d -o gearman /run/gearman
PermissionsStartOnly=true
User=gearman
PIDFile=/run/gearman/server.pid
ExecStart=/usr/sbin/gearmand $PARAMS $DBTYPE ${DBCONNINFO} $DBTABLE

[Install]
WantedBy=multi-user.target
PARAMS=--listen=127.0.0.1 \
--pid-file=/run/gearman/server.pid \
--log-file=/var/log/gearman-job-server/gearman.log \
--daemon

DBTYPE=--queue-type=postgres
DBTABLE=--libpq-table=queue
DBCONNINFO=--libpq-conninfo=host=127.0.0.1 user=gearman password=password dbname=gearman

Спасибо за подсказку.

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

Одинарные я оставлял в твоём варианте. Ругалось на 'host -> uncnown command. Пока не разнёс параметры по отдельным переменным, не работало.

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

Гм. Да, действительно, кавычки обрабатываются и стрипаются только на границе слова. В общем, systemd — не шелл, правила обработки EnvironmentFile и подстановок переменных там значительно более примитивны.

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