Как лучше всего запустить службу systemd для запуска нескольких приложений

Если необходимо обнулить определенные биты памяти (например, пароль или закрытый ключ), вам понадобится обработчик сигнала, который вызывает memset (3) или что-то еще до того, как процесс покажет себя. дверь. См. Также libsodium , в котором есть несколько удобных и переносимых подпрограмм, относящихся к этому: натрия_mlock , натрия_memzero и т. Д. Можно всегда обнулять всю память после каждого выхода из процесса. ядром, хотя, несомненно, замедлит работу системы.

Ранее использованная (но, возможно, ненулевая) память будет повторно использована ядром при необходимости; программисты языков, которые предлагают ручное выделение памяти, должны знать, что их структуры данных могут содержать неизвестно что из некоторой предыдущей программы (здесь уместен флаг компилятора -Wuninitialized ).

А что касается утверждения Стивена Китта о том, что все выделения всегда обнуляются, что ж, я думаю, вы могли бы написать код, исходя из этого предположения.

#include 
#include 
#include 
#include 
int main(void)
{
    int i, blahblah[1000000];
    for (i = 0; i < 1000000; i++) {
      if (blahblah[i] != 0) {
          printf("whoops, %d at %d ain't zero\n", blahblah[i], i);
      }
    }
    exit(EXIT_SUCCESS);
}

1
02.05.2019, 15:57
2 ответа

Запуск всех процессов в фоновом режиме должен работать, но тогда вам нужно использовать Type=forkingи, вероятно, вы захотите использовать еще несколько параметров, в частности RemainAfterExit=yes, вероятно, важно.

Этот вариант использования аналогичен обработке сценария rc.local, который обрабатывается в systemd через этот шаблон модуля , поэтому, возможно, было бы неплохо использовать все эти параметры:

[Service]
Type=forking
ExecStart=/usr/start_apps.sh
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

Я не знаю, почему вы блокируетесь и вам приходится нажимать Ctrl+C в случае, когда последний процесс находится на переднем плане... Нужно ли нажимать Ctrl+C в самой команде systemctl start? ? Я бы сказал, что это немного странно...

Обратите внимание, что запуск приложений таким образом (многие из них в фоновом режиме, из скрипта )на самом деле не предназначен для использования systemd, и вы упустите некоторые функции. Например, systemctl stopили systemctl restart, скорее всего, вообще не будут работать на этом устройстве.

В наши дни запуск приложений в фоновом режиме рассматривается как «взлом» (не только systemd, но и многими его предшественниками, а также большинством других современных сервис-менеджеров. )Хотя systemd по-прежнему может это делать, эта поддержка в основном предназначена для обратной совместимости и не предназначена для использования, когда существуют лучшие альтернативы.

Я бы порекомендовал вам создать отдельные службы для каждого приложения или, возможно, использовать блоки шаблонов, если вы запускаете несколько экземпляров одного и того же процесса. Также изучите директивы, чтобы указать зависимости между модулями, чтобы они запускались и останавливались в правильном порядке. В частности, взгляните на директиву PartOf=, которая позволяет вам управлять группой сервисов как единым целым, позволяя вам запускать, останавливать или перезапускать их все вместе с помощью одной команды.

3
27.01.2020, 23:30

Если эти приложения могут дать сбой и их потребуется перезапустить, или если их когда-либо потребуется остановить или перезапустить по отдельности, рассмотрите возможность проверки supervisorctl .

Вы можете запустить supervisorctlиз systemd в качестве первоклассной службы, а затем иметь возможность запускать любое количество зависимых процессов и управлять ими, предоставляя вам единое место для запуска или остановки ваших служб (supervisorctl stop all,supervisorctl start all)и аналогичные возможности аудита для systemd(supervisorctl status myapp).

Документы для supervisorctl довольно хороши, и похоже, что ваш вариант использования может быть таким, что простого сценария оболочки, такого как вы опубликовали, может быть недостаточно, чтобы выполнить это без значительной головной боли.

1
27.01.2020, 23:30

Теги

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