プロセスの内部状態が準備されるまで、システムの「開始」状態を延長します。

プロセスの内部状態が準備されるまで、システムの「開始」状態を延長します。

systemd でサービスを開始すると、プロセスはactivating一定期間だけその状態を維持します。activeプロセスが正常に開始すると、次のように変換されます。

しかし、準備に時間がかかる複雑なサービスがある場合はどうすればよいですか?activatingサービスが内部的に準備されるまで状態をどのように拡張できますか?

答え1

[Service]組織セクションで追加(または変更)Type=notify

これは、プロセス自体が起動時に信号を発することをsystemdに伝えます。したがって、プロセスの開始時に systemd はプロセスが準備されたと仮定しません。

これにはプロセスを実装する必要があります。sd_notification(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

関連情報