Systemd:如何在另一个服务启动后启动该服务

Systemd:如何在另一个服务启动后启动该服务

我有这两个服务,一个是 Google 启动脚本服务,第二个是 redis 服务,我想在启动脚本服务启动完成后启动 redis 服务,我有以下 systemd 配置,但我的 redis 服务不会使用这些配置启动

google-startup-scripts.service
[Unit]
Description=Google Compute Engine Startup Scripts
After=network-online.target network.target rsyslog.service
After=google-instance-setup.service google-network-daemon.service
After=cloud-final.service multi-user.target
Wants=cloud-final.service
After=snapd.seeded.service
Wants=snapd.seeded.service

[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/google_metadata_script_runner --script-type startup
KillMode=process
Type=oneshot
StandardOutput=journal+console
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

[Install]
WantedBy=multi-user.target

redis.service

[Unit]
Description=Redis In-Memory Data Store
After=google-startup-scripts.service

[Service]
Type=notify
PIDFile=/run/redis-6378.pid
ExecStart=/usr/bin/redis-getdevice /etc/redis-getdevice/6378.conf
ExecStop=/usr/bin/redis-cli -p 6378 shutdown
Restart=always

[Install]
WantedBy=multi-user.target

一旦 google-startup-script.service 运行并执行操作并进入退出状态。并且 redis 服务根本没有启动(我After在单元中使用)我在这里做错了什么

答案1

有许多不同的关键字可以指定 systemd 单元依赖项。每个关键字在故障处理方面都有略微不同的效果和含义,例如“启动”和“等待启动完成”例如:

Wants

配置对其他单元的(弱)需求依赖关系。...如果配置单元是,则此选项中列出的单元将被启动。...

Requires

类似于 Wants=,但声明了更强的需求依赖性。... 如果此单元被激活,则列出的单元也将被激活。如果其他单元之一无法激活,并且对失败的单元设置了 After= 排序依赖性,则此单元将不会启动。...

After

... 如果单元foo.service包含设置Before=bar.service并且两个单元都正在启动,bar.service则的启动将延迟,直到 foo.service 完成启动。After=是的逆Before=,即Before=确保在列出的单元开始启动之前启动配置的单元,After=确保相反,列出的单元在配置的单元启动之前完全启动。...

在这方面,您的 redid.service 单元及其After=google-startup-scripts.service依赖关系似乎是正确的。

您的问题似乎是 google-startup-scripts.serviceType=oneshot. 当主ExecStart= 进程退出后,systemd 服务管理器将认为该单元已启动。

可能发生的情况是,脚本触发任务启动并运行在背景中并且不会等待它们完成(或完成启动)。脚本将继续执行后续步骤,然后成功完成,systemd 认为该单元已启动,但一个或多个进程尚未启动。

您可能需要调整正在运行的/usr/bin/google_metadata_script_runner --script-type startup

答案2

https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html

除了单元文件 foo.service 之外,目录 foo.service.wants/ 也可能存在。从此类目录符号链接的所有单元文件都会隐式添加到该单元,作为 Wants= 类型的依赖项。Requires= 类型的依赖项也存在类似的功能,在这种情况下,目录后缀为 .requires/。此功能可用于将单元挂接到其他单元的启动中,而无需修改其单元文件。

根据您的具体情况,您可以[Install]从单元文件中删除部分内容。

您也可以使用PartOf=systemgoogle-startup-scripts.service[Unit]部分。

systemctl disable redis.service

systemctl stop redis.service

mkdir /usr/lib/systemd/system/systemgoogle-startup-scripts.service

cd /usr/lib/systemd/system/systemgoogle-startup-scripts.service

ln -s ../redis.service .(根据您的需要进行调整)。

systemctl enable redis.service

systemctl restart systemgoogle-startup-scripts.service

systemctl status redis.service

如果一切按计划进行,从输出中您会注意到它现在已作为静态服务加载并且处于活动状态。

相关内容