我有两个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.service
first.service 代码中的。根据文档,第一个服务在第二个服务启动之前不应运行。但即使我禁用或停止第二个服务,第一个服务仍可正常运行。我在这里做错了什么?
答案1
您误读了文档。引用:
如果单位
foo.service
包含设置Before=bar.service
两台机组均已启动,bar.service
的启动被延迟,直到foo.service
完成启动。After=
是 Before= 的逆
由我突出显示。这仅在两个单元都启动时才有效。如果禁用其中一个,则无效。
目前还不太清楚你到底想要什么。
可能更好的选择是:
类似于
Wants=
,但声明了更强的需求依赖性。这种类型的依赖项也可以通过向.requires/
单元文件附带的目录添加符号链接来配置。如果此单元被激活,则列出的单元也会被激活。如果其他单元之一无法激活,并且
After=
设置了对失败单元的顺序依赖性,则不会启动此单元。此外,无论是否指定After=
,如果其他单元之一明确停止,则此单元将被停止。
配置与 类似的依赖项
Requires=
,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,该操作将传播到此单元。请注意,这是一种单向依赖项 — 对此单元的更改不会影响列出的单元。