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 文档(关于Before=After=),

请注意,这些设置与 Requires=、Wants=、Requisite= 或 BindsTo= 配置的需求依赖关系是独立且正交的。在 After= 和 Wants= 选项中包含单元名称是一种常见模式,在这种情况下,列出的单元将在使用这些选项配置的单元之前启动。

After=仅告诉 Systemd 应以何种顺序启动和停止服务。它不会告诉它自动启动服务。您应该将其添加Requires=google-startup-scripts.service到 redis 单元文件中,然后启用它。它将首先自动运行 google-startup-scripts。如果 google-startup-scripts 失败,那么 redis 服务也会失败。

例如,

[Unit]
Description=Redis In-Memory Data Store
Requires=google-startup-scripts.service
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

相关内容