Как уже было сказано, в systemd
намеренно отсутствует поддержка сложной логики. Если необходимо выполнить какую-либо логику запуска (и она не является частью самого демона), вполне нормально написать небольшой сценарий оболочки и указать его в ExecStart =
.
Однако есть одна вещь, которую следует учитывать. Сценарий оболочки не должен самостоятельно управлять какими-либо процессами. Сценарий оболочки должен выполнить
демон. Это необходимо, чтобы избежать вмешательства в наблюдение и управление собственными процессами systemd.
Пример неправильного сценария оболочки:
#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi
$DAEMON -- $DAEMON_SERVER_OPTS
Это делает демон дочерним по отношению к интерпретатору оболочки. Если демон не разветвляется и протокол готовности ( Type =
) простой
, то это просто дублирующий процесс. В противном случае, если демон выполняет разветвление и вы устанавливаете Type = forking
, тогда все будет выполнено тройным, а не двойным ветвлением, и systemd убьет демон.
Пример правильного сценария оболочки:
#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi
exec $DAEMON -- $DAEMON_SERVER_OPTS
Заменяет процесс оболочки на демон.
Вместо grep production
, которая соответствует любой строке, содержащей слово «производство», используйте awk '$3 == "production"'
, которая соответствует только строкам, в которых третьим полем является «производство».
Нет необходимости в каких-либо дополнительных действиях внутри awk
:, по умолчанию будет напечатана вся совпадающая строка.