С sh scriptname.sh
, вы запускаете его с sh
, не обязательно с bash
. Попробуйте сравнить sh --version
на обеих машинах. И / или с dpkg -S $ (который sh)
.
Главный процесс обрабатывает смерть своих детей обычным образом.
Это мир POSIX. Если процесс A разветвил B, а процесс B разветвил C, D и E; тогда процесс B - это то, что видит статус SIGCHLD
и wait ()
после завершения C, D и E. Процесс A не знает, что происходит с C, D и E , и это независимо от systemd.
Чтобы A узнал об окончании C, D и E, должны произойти две вещи.
service-manager
. exit ()
. Сервисы, которые глупо, ошибочно и тщетно пытаются «демонизировать» себя, делают это. (Можно поумнеть с kevent ()
на BSD. Но это вопрос Linux.)
systemd
имеет понятие главного процесса.В документации systemd это называется «основным процессом службы» или просто «основным процессом».
Пример 4 в документации по systemd.service описывает вычисление основного процесса, когда Type = разветвление
.
Документация для Restart =
в документации systemd.service описывает различные возможности запуска службы по отношению к основному процессу.
Вот ключевой текст из «примера 4», ссылка на который приведена выше:
systemd будет считать, что служба находится в процессе инициализации , в то время как исходная программа все еще выполняется. После успешного завершения и сохранения хотя бы одного процесса (и RemainAfterExit = no) служба считается запущенной.
Часто традиционный демон состоит только из одного процесса. Следовательно, , если после завершения исходного процесса остается только один процесс, systemd будет считать этот процесс основным процессом службы. В этом случае переменная $ MAINPID будет доступна в ExecReload =, ExecStop = и т. Д.
Если осталось более одного процесса, systemd не сможет {{1} } определить основной процесс, поэтому он не будет предполагать, что он есть. В этом случае $ MAINPID не будет расширяться ни во что. Однако, если процесс решит записать традиционный файл PID, systemd сможет прочитать оттуда основной PID. Пожалуйста, установите PIDFile = соответственно.