我有这两个服务,一个是 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=,但声明了更强的需求依赖性。... 如果此单元被激活,则列出的单元也将被激活。如果其他单元之一无法激活,并且对失败的单元设置了 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
如果一切按计划进行,从输出中您会注意到它现在已作为静态服务加载并且处于活动状态。