модуль systemd с netcat и fifo

Вы не пишете причину, по которой хотите конвертировать скрипт. Возможно, вы хотите, чтобы скрипт не зависел от GNU Parallel.

Если это так, вас может заинтересовать parallel --embed, который встраивает GNU Parallel в скрипт оболочки:

parallel --embed > newscript

Затем отредактируйте конец newscript.

Затем вы можете использовать newscriptна машинах, на которых не установлена ​​GNU Parallel.

--embedдоступно с версии 20180322.

1
09.06.2020, 19:43
1 ответ

Очевидный, но неверный ответ: «НоSIGPIPEприведет к завершению вашей программы, потому что это то, что делает SIGPIPE, и, следовательно, установка Restart=alwaysвызовет ее перезапуск».

Это неправильно, потому что по умолчанию systemd запускает службы с игнорированием сигнала SIGPIPE. Таким образом, сервисный процесс и его дочерний процесс (ren ), который в данном случае является оболочкой, интерпретирующей скрипт, просто игнорируют любые SIGPIPEи продолжают работу.

Почему systemd это делает? Это из-за systemd-journald. В более ранних версиях systemd при сбое systemd-journaldили ином прекращении работы все службы, чьи стандартные выходные данные и стандартные ошибки отправлялись в него, получали SIGPIPE. Если не проигнорировать, это приведет к тому, что почти все службы в системе будут отключены systemd-journald, что, мягко говоря, прискорбно. Люди из systemd не усвоили урок от daemontools, где svscanсохранялись дескрипторы открытых файлов для каналов между «основной» службой и службой «журнала», чтобы «основные» службы никогда не становились ложными SIGPIPEs, когда службы журнала были перезапущены по какой-либо причине.

В конце концов, несколько лет спустя, они спохватились, и теперь systemd хранит открытые файловые дескрипторы каналов, соединяющих сервисы с systemd-journald, хотя и делает это довольно окольным образом, позволяя процессам внедрять файловые дескрипторы по своему выбору в процесс #1. Игнорировать SIGPIPEв качестве стандарта больше нет необходимости, потому что больше нет необходимости замалчивать исходную проблему.

Но значение по умолчанию для настройки IgnoreSIGPIPEв служебной единице остается yes.

Измените его на noв вашем сервисном центре.

Дополнительная литература

2
18.03.2021, 23:29

Теги

Похожие вопросы