Вы не пишете причину, по которой хотите конвертировать скрипт. Возможно, вы хотите, чтобы скрипт не зависел от GNU Parallel.
Если это так, вас может заинтересовать parallel --embed
, который встраивает GNU Parallel в скрипт оболочки:
parallel --embed > newscript
Затем отредактируйте конец newscript
.
Затем вы можете использовать newscript
на машинах, на которых не установлена GNU Parallel.
--embed
доступно с версии 20180322.
Очевидный, но неверный ответ: «НоSIGPIPE
приведет к завершению вашей программы, потому что это то, что делает SIGPIPE
, и, следовательно, установка Restart=always
вызовет ее перезапуск».
Это неправильно, потому что по умолчанию systemd запускает службы с игнорированием сигнала SIGPIPE
. Таким образом, сервисный процесс и его дочерний процесс (ren ), который в данном случае является оболочкой, интерпретирующей скрипт, просто игнорируют любые SIGPIPE
и продолжают работу.
Почему systemd это делает? Это из-за systemd-journald
. В более ранних версиях systemd при сбое systemd-journald
или ином прекращении работы все службы, чьи стандартные выходные данные и стандартные ошибки отправлялись в него, получали SIGPIPE
. Если не проигнорировать, это приведет к тому, что почти все службы в системе будут отключены systemd-journald
, что, мягко говоря, прискорбно. Люди из systemd не усвоили урок от daemontools, где svscan
сохранялись дескрипторы открытых файлов для каналов между «основной» службой и службой «журнала», чтобы «основные» службы никогда не становились ложными SIGPIPE
s, когда службы журнала были перезапущены по какой-либо причине.
В конце концов, несколько лет спустя, они спохватились, и теперь systemd хранит открытые файловые дескрипторы каналов, соединяющих сервисы с systemd-journald
, хотя и делает это довольно окольным образом, позволяя процессам внедрять файловые дескрипторы по своему выбору в процесс #1. Игнорировать SIGPIPE
в качестве стандарта больше нет необходимости, потому что больше нет необходимости замалчивать исходную проблему.
Но значение по умолчанию для настройки IgnoreSIGPIPE
в служебной единице остается yes
.
Измените его на no
в вашем сервисном центре.