After= 选项在 systemd 服务文件中不起作用

After= 选项在 systemd 服务文件中不起作用

我有两个shell脚本,分别名为first.sh和second.sh,first.sh和second.sh的内容如下:

    >>first.sh
    #!/bin/bash
    while true
    do 
        echo The current time is $(date)
        sleep(1)
    done



    >>second.sh
    #!/bin/bash
    while true
    do 
        echo The current time from second script is $(date)
        sleep(1)
    done

同样的,first.service的内容为:

[Unit]
Description=first service
After=second.service
[Service]
ExecStart=/home/abanstola/first.sh

second.service的内容为:

[Unit]
Description=Second service
[Service]
ExecStart=/home/abanstola/second.sh

请注意After=second.servicefirst.service 代码中的。根据文档,第一个服务在第二个服务启动之前不应运行。但即使我禁用或停止第二个服务,第一个服务仍可正常运行。我在这里做错了什么?

答案1

您误读了文档。引用

如果单位foo.service包含设置Before=bar.service 两台机组均已启动bar.service的启动被延迟,直到foo.service完成启动。After=是 Before= 的逆

由我突出显示。这仅在两个单元都启动时才有效。如果禁用其中一个,则无效。

目前还不太清楚你到底想要什么。

可能更好的选择是:

Requires=

类似于Wants=,但声明了更强的需求依赖性。这种类型的依赖项也可以通过向.requires/单元文件附带的目录添加符号链接来配置。

如果此单元被激活,则列出的单元也会被激活。如果其他单元之一无法激活,并且After=设置了对失败单元的顺序依赖性,则不会启动此单元。此外,无论是否指定After=,如果其他单元之一明确停止,则此单元将被停止。

PartOf=

配置与 类似的依赖项Requires=,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,该操作将传播到此单元。请注意,这是一种单向依赖项 — 对此单元的更改不会影响列出的单元。

相关内容