启动任务的运行顺序是怎样的?

启动任务的运行顺序是怎样的?

我有一台 Debian 10 服务器,我正在运行 systemctl 服务。我使用systemctl enable myservice它在启动时运行它。此外,我还有几行 bash 脚本,它们有助于为服务设置网络/端口转发等。我希望该 bash 脚本在启动时运行。我将使用这个答案在启动时运行它。我的问题是,这些事情将按照什么顺序执行?是先运行 bash 脚本还是先运行 systemctl 服务?我必须确保先运行 bash 脚本,然后再运行服务。默认情况下是这样吗?如果不是,我该如何实现?

答案1

没有顺序。一般来说,总是假设所有事情都可能同时发生,并且没有保证的顺序,直到你要求一。(尽管 systemd 有多个启动阶段,但您提到的两件事都发生在同一个阶段。)

rc.local 脚本本身作为正常服务运行。它要求“联网后”运行,但除此之外,没有尝试放置在任何特定的位置 - 因此将要与其他正常服务同时运行。

另外,避免使用 rc.local。它总是会成为一堆不同任务的垃圾场,而这些任务通常具有相互矛盾的排序要求。为所有尚未具有通用服务的任务创建单独的服务。(您不需要为 /proc/sys 创建新服务 - systemd-sysctl 可以处理这个问题。您不需要为 iptables 创建新服务 - iptables-persistent 可以处理这个问题。)

你找到的答案写在2010Debian 启动过程发生了很大变化从那时起。对于大多数线性 LSB/sysv init 有意义的东西对于 systemd 来说可能不再有意义,反之亦然。

因此,有两种方法可以确保您的脚本在您的(现有)服务之前运行:

单独的服务

每当您创建新服务时,都可以使用Before=After=明确要求将其排序在其他服务之前或之后,只要两件事情同时排队:

[单元]
描述=自定义端口转发配置
之前=myservice.service

[服务]
类型=oneshot
ExecStart=/etc/enable-port-forwarding.sh
退出后继续保留=是

[安装]
WantedBy=多用户.目标

现有服务的一部分

如果任务 1)很快,并且 2)非常特定于一个服务,它可以作为该服务本身内的 ExecStartPre= 命令运行:

[服务]
...
ExecStartPre=/etc/enable-port-forwarding.sh
ExecStart=/usr/bin/myservice
...

相关内容