Назад | Перейти на главную страницу

Удаление службы systemd с помощью systemctl и без нее

В чем разница между убийством работающей службы демона systemd следующим образом:

kill -SIGKILL 3645

и

systemctl -s kill -SIGKILL 3645

где 3645 - это pid сервиса systemd. Есть ли недостатки у использования первого метода?

Во-первых, ваш systemctl синтаксис неверен: systemctl kill ожидает имя устройства, а не PID, и -s требуется имя сигнала. Как написано, он ничего не сделает, кроме сообщения об ошибке:

Failed to parse signal string kill.

Если вы это исправите, он сообщит вам:

Failed to kill unit 3645.service: Unit 3645.service not loaded.

Правильный синтаксис:

systemctl kill -s SIGWHATEVER whatever.service

Разница, очевидно, в том, что вы можете отправлять сигналы процессам на основе модуля systemd, а не pid. Поскольку модуль может запускать несколько процессов, systemd может отправить тот же сигнал в все процессы, запущенные под модулем, и действительно, это значение по умолчанию. В --kill-who= опция позволяет вам изменить это при необходимости.

В целом, однако, не стоит иметь привычку посылать SIGKILL кому-либо. По возможности вы должны останавливать свои службы в обычном режиме, например с участием systemctl stop whatever.service. SIGKILL - это то же самое, что и потенциально деструктивный kill -9 вы наверняка слышали о нем и вас предупреждали. И, если вы убиваете службу любым из методов и она настроена на автоматический перезапуск, она может это сделать. Это может быть или не быть тем, что вы хотите, в зависимости от Зачем вы пытаетесь отправить сигнал об уничтожении.