有条件地启动系统服务?


14

在我的组织中,我们为许多不同的服务(例如ECS和Docker)提供了易于使用的基本AMI。由于我们的许多项目都涉及CloudFormation,因此我们使用cfn-bootstrap,它由几个脚本和一项服务组成,这些服务在启动时运行以安装某些软件包并为我们执行某些配置管理任务。

系统启动时,必须执行以下脚本的等效项:

#!/bin/bash

# capture stderr only
output="$(cfn-init -s $STACK_NAME -r $RESOURCE_NAME --region $REGION >/dev/null)"

# if it failed, signal to CloudFormation that it failed and include a reason
returncode=$?
if [[ $returncode == 0]]; then
    cfn-signal -e $returncode -r "$output"
    exit $returncode
fi

# otherwise, signal success
cfn-signal -s

我当时正在考虑将其作为oneshot可运行After=network.target和运行的系统服务运行WantedBy=multi-user.target

唯一的问题是我希望我的AMI灵活一些,并且仅在存在某个文件的情况下才执行此操作。无需将上面的脚本嵌入到EC2用户数据中,我可以让用户数据仅定义一个环境文件,该文件定义了我所需的变量,并且仅在存在该环境文件的情况下运行我的一次性服务:

#cloud-init
write_files:
    - path: /etc/sysconfig/cloudformation
      # ...
      content: |
          CFN_STACK_NAME="stack-name"
          CFN_RESOURCE="resource-name"
          CFN_REGION="region"

有没有一种方法可以使systemd仅在满足给定条件的情况下运行服务?

Answers:


16

systemd提供了可以测试的多种条件。例如,您可以ConditionPathExists=用来测试文件的存在。

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
值得注意的是,这不是一个while条件,而是一个条件,if表示如果ConditionPathExists在服务启动时指定的路径不存在,则该服务的其余部分将不会运行。即,它不等待路径存在。
马恩

@Mahn使用systemd计时器,应该有可能在一定间隔内重复触发服务以克服该限制。
Naftuli Kay

@Mahn看看freedesktop.org/software/systemd/man/systemd.path.html#。它可以监视路径并根据(例如)路径何时存在来提供激活。
benf

2

我偶然发现了这个问题,寻找使用条件启动系统服务的方法。有很多方法:

ConditionArchitecture=, ConditionVirtualization=, ConditionHost=, ConditionKernelCommandLine=, ConditionSecurity=, ConditionCapability=, ConditionACPower=, ConditionNeedsUpdate=, ConditionFirstBoot=, ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=

我想基于特定的主机名启动该服务。

ConditionHost=可用于与主机的主机名或计算机ID匹配。它要么接受一个主机名字符串(可以选择使用shell样式的glob),然后将其与由gethostname(2)返回的本地设置的主机名进行测试,或者采用格式化为字符串的计算机ID(请参阅machine-id(5))。可以通过在感叹号之前添加否定该测试。

这里更多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.