Должен ли я перенести скрипты в формат systemd?
Да.
Вас укусил известный недостаток в скриптах System 5
rc
. На самом деле это не имеет никакого отношения к systemd. Вы могли бы попасть под дефект, если бы вам удалось запустить скрипты параллельно каким-то другим способом, например, с помощьюstartpar
.Хорошо известно, что поиск по выводам
ps
подвержен гонкам, как противgrep
, так и против текущего состояния системы, и можно найти десятилетия людей, сообщающих о попадании в эти же ошибки снова и снова с разными сценариями оболочки. Это глупо и ошибочно, и упоминается в разделе "BUGS" на странице руководства BSD дляps
. Мир уже должен знать лучше.Мир действительно знает лучше, и уже давно. У нас есть менеджеры служб, которые работают должным образом, без всех этих навороченных механизмов, включающих поиск по списку процессов и файлы, которые могут содержать или не содержать нужный номер, с начала 1990-х годов. Вам следует определенно, если вы столкнулись с этим и другими условиями гонки, выбросить эти шаткие, подверженные сбоям, идиосинкратические и грязные скрипты System 5
rc
и использовать правильное управление службами. Никаких "если", никаких "но", никаких "быстрых обходных путей", которые вы уже используете (лишниеgrep
ы сами по себе являются обходными путями).Существует множество таких сервис-менеджеров. Вы не обязаны использовать systemd. Различные сценарии, которые можно написать для runit, nosh или perp, так же просты, как и файлы модулей, которые можно написать для systemd.
В способах работы nosh и systemd нет двух основных служб, проверяющих и запускающих второстепенную. Это работа системы управления службами. Скорее вы просто объявляете зависимость от двух первичных сервисов для вторичного, так что система управления сервисами знает, что когда ей говорят запустить
Agentdaemon.service
иSecuritydaemon.service
, она должна запустить иcommon.service
. В блоках служб systemd это будет параметрRequires=
илиWants=
.Дальнейшее чтение
- Shlomi Noach (2009-10-01). Как НЕ проверять, что mysqld жив. code.openark.org.
- Джонатан де Бойн Поллард (2015). Семейство daemontools. Часто задаваемые ответы.
- Джонатан де Бойн Поллард (2014). Взгляд сбоку на сценарии выполнения и служебные единицы. . Часто задаваемые вопросы.
- Lennart Poettering (2013-10-07).
systemd.unit
. страницы руководства по systemd. freedesktop.org.- Greg Wooledge. "Риск разбора дерева процессов". Process Management. Вики Грега.
Вам нужно экспортировать имя переменной, а не значение.
Вы можете либо экспортировать имя для всех подпроцессов с помощью инструкции GNU Make export
export TargetLocation
Если вы хотите получить значение только для одного правила, ваш оператор должен иметь обычный синтаксис оболочки
export TargetLocation="$(TargetLocation)"; \
./EditHtml.sh
В этом случае, в зависимости от содержимого переменной, могут потребоваться кавычки, и она по-прежнему будет уязвима, если для переменной могут быть произвольные значения. С другой стороны, если make запускается с привилегиями вызывающего пользователя, дополнительной опасности нет.