Продлить статус «запуск» systemd до тех пор, пока внутреннее состояние процесса не будет готово

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

Таким образом, самое простое решение — не запускать редактор под sudo. Просто скопируйте исходный файл, измените копию и скопируйте ее обратно поверх оригинала. Здесь повышенные привилегии могут потребоваться только для операций копирования. Во многих системах вы можете использовать этот подход с

$ sudoedit /path/to/file

Это запустит $SUDO_EDITOR, $VISUALили$EDITOR(проверено в этом порядке )со стандартными привилегиями на временной копии целевого файла и зафиксирует изменения в оригинале после выхода из редактора.

Если ваш редактор настроен на emacsclientвместо emacs,и у вас есть открытый emacs в режиме сервера, вам нужно только закрыть буфер (, а не emacs в целом ), чтобы зафиксировать изменения.

1
09.12.2020, 10:39
1 ответ

В секции [Service]вашего устройства добавьте (или измените)Type=notify.

Это сообщает systemd, что сам процесс будет сигнализировать о своем запуске. Поэтому systemd не будет считать, что он готов, когда процесс запущен.

Чтобы это работало, процесс должен реализовать sd _notify (3).


Вот минимальный пример службы уведомлений на C:

# notifier.service
[Service]
Type=notify
ExecStart=%h/bin/notifier
/* main.c */
#include <systemd/sd-daemon.h>
#include <unistd.h>

int main(void) {
        /* Sleep to emulate 10s bootup time */
        /* Expect status 'activating (start)' during this */
        /* `systemctl start`, will block */
        sleep(10);

        /* Send a signal to say we've started */
        sd_notify(0, "READY=1");

        /* Units which are After= this unit will now start */
        /* `systemctl start` will unblock now */

        /* Sleep to emulate 10s run time */
        /* Expect status 'active (running)' during this */
        sleep(10);

        /* Send a signal to say we've started the shutdown procedure */
        sd_notify(0, "STOPPING=1");

        /* Sleep to emulate 10s shutdown */
        /* Expect status 'deactivating' during this */
        sleep(10);

        return 0;

        /* Expect status 'inactive (dead)' at this point */
}
# makefile
a.out: main.c
        gcc main.c -lsystemd

install: a.out notifier.service
        install -D a.out ~/bin/notifier
        install -D notifier.service ~/.config/systemd/user/notifier.service
2
18.03.2021, 22:44

Теги

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