0

我需要知道如何使用带有外部脚本条件的 start-stop-daemon 运行服务。类似于在 systemctl .service 文件中所做的事情,例如:

注意:我需要执行与ExecCondition参数相同的操作

[Unit]
Description=My description

[Service]
Type=simple
ExecCondition=/usr/local/bin/checksome.sh
ExecStart=mainscript.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

问候。

4

1 回答 1

-1

(见下文英文翻译)

我回应我的错误...

Dentro del Directorio /etc/init.d se encuentra el fichero con el servicio que queremos modificar, por ejemplo el servicio emqx。Tendremos algo como esto:

do_start()
{
    start-stop-daemon --start \
        --name emqx \
        --user emqx \
        --exec /usr/local/bin/checkconditionandrun.sh emqx -- start \
        || return 2
}

case "$1" in
start)
    log_daemon_msg "Starting emqx"
    do_start
    case "$?" in
        0|1) log_end_msg 0 ;;
        2) log_end_msg 1
            exit 1
            ;;
    esac
    ;;
stop)
    log_daemon_msg "Stopping emqx"
    do_stop
    case "$?" in
        0|1) log_end_msg 0 ;;
        2) log_end_msg 1
            exit 1
            ;;
    esac
    ;;

La clave de todo esto está en dos cosas:

1.- En la función do_start() el comando start-stop-daemon --start no debe de llamar directamente al comando "emqx start" lo que se hace es llamar a un script para verifique lo que necesitamos verificar ya continuación ese script ejecutará o no el comando pasado como parametro。

2.- Ahora si queremos que nuestro servicio se reinicie automáticamente si ha fallado , tal como se haría mediante un .service con las entradas Restart=always y RestartSec=10, debemos saber lo siguiente:

a) systemd es 兼容 con los 脚本 heredados /etc/init.d de esta manera, cuando systemd carga definiciones de servicio, systemd-sysv-generator autogenera archivos .service sobre la marcha a partir de los scripts en /etc/init.d .

b) Podemos agregar configuración a un servicio autogenerado agregando archivos "drop-in" llamados "restart.conf" a una Caribbean con el siguiente nombre: /etc/systemd/system/nombreservicio.service.d/

Teniendo en cuenta lo anterior y suponiendo que nuestro servicio se llame "emqx", podemos crear un fichero en la siguiente Caribbean:

/etc/systemd/system/emqx.service.d/restart.conf

con el siguiente contenido:

[Service]
Restart=always
RestartSec=10

De esta manera conseguimos que un servicio contenido en init.d podamos controlar tanto su arranque como suterior reintento de re-arranque por parte del propio systemd。

相关信息:

https://singlebrook.com/2017/10/23/auto-restart-crashed-service-systemd/

https://www.freedesktop.org/software/systemd/man/systemd.service.html

https://www.digitalocean.com/community/tutorial_series/how-to-configure-a-linux-service-to-start-automatically-after-a-crash-or-reboot


用英语讲....

我自己回答...

/etc/init.d 目录里面是我们要修改的服务的文件,例如 emqx 服务。我们会有这样的东西:

do_start()
{
    start-stop-daemon --start \
        --name emqx \
        --user emqx \
        --exec /usr/local/bin/checkconditionandrun.sh emqx -- start \
        || return 2
}

case "$1" in
start)
    log_daemon_msg "Starting emqx"
    do_start
    case "$?" in
        0|1) log_end_msg 0 ;;
        2) log_end_msg 1
            exit 1
            ;;
    esac
    ;;
stop)
    log_daemon_msg "Stopping emqx"
    do_stop
    case "$?" in
        0|1) log_end_msg 0 ;;
        2) log_end_msg 1
            exit 1
            ;;
    esac
    ;;

这一切的关键在于两件事:

1.- do_start() 函数中,start-stop-daemon --start 命令不能直接调用“emqx start”命令。必须调用一个脚本来验证我们需要验证的内容,然后该脚本将执行或不执行作为参数传递的命令。

2.- 现在,如果我们希望我们的服务在失败时自动重启,就像通过输入 Restart=always 和 RestartSec=10 的 .service 一样,我们必须知道以下内容:

a) systemd 以这种方式支持遗留脚本 /etc/init.d,当 systemd 加载服务定义时,systemd-sysv-generator 会从 /etc/init.d 中的脚本即时自动生成 .service 文件。

b)我们可以通过将名为“restart.conf”的“drop-in”文件添加到具有以下名称的文件夹中来为自动生成的服务添加配置:/etc/systemd/system/servicename.service.d/

如上所述,假设我们的服务名为“emqx”,我们可以在以下文件夹中创建一个文件:

/etc/systemd/system/emqx.service.d/restart.conf

内容如下:

[Service]
Restart=always
RestartSec=10

通过这种方式,我们实现了 init.d 中包含的服务可以通过 systemd 本身控制其启动和随后的重新启动重试。

有关它的更多信息:

https://singlebrook.com/2017/10/23/auto-restart-crashed-service-systemd/

https://www.freedesktop.org/software/systemd/man/systemd.service.html

https://www.digitalocean.com/community/tutorial_series/how-to-configure-a-linux-service-to-start-automatically-after-a-crash-or-reboot

于 2021-12-23T08:05:51.517 回答