具有外部脚本条件的启动停止守护进程 运行

start-stop-daemon run with external script condition

我需要知道如何 运行 具有外部脚本条件的启动-停止守护进程的服务。类似于在 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

此致。

(见下文英文翻译)

我自己回答...

目录/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 "" 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 es compatible con los scripts 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 carpeta con el siguiente nombre: /etc/systemd/system/nombreservicio.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


英文....

我自己回答...

在/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 "" 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 supports legacy scripts /etc/init.d this way, when systemd loads service definitions, systemd-sysv-generator autogenerates .service files on the fly from the scripts in /etc/init.d.

b) We can add configuration to an auto-generated service by adding "drop-in" files called "restart.conf" to a folder with the following name: /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