【问题标题】:How to shell script a wrapper for a service如何为服务编写外壳脚本
【发布时间】:2023-04-08 23:42:01
【问题描述】:

我有一个系统服务foo,它通过/usr/sbin/service restart foo 启动和停止。它又似乎是由一个 shell 脚本控制的 /etc/init.d/foo

如何创建“预启动”挂钩,以便在此服务启动之前运行额外的 shell 脚本?在这种情况下,预启动挂钩是必须从云提供商元数据目录中获取的额外配置,然后插入到foo 正确启动所必需的配置文件中。

我考虑过直接修改/etc/init.d/foo,这样可行。但这会使预期的频繁补丁级别升级复杂化,我将通过apt-get upgrade 了解这些升级。我想避免需要重新建立钩子的解决方案。

第二种选择是我可以创建一个fooWrapper 服务,从所有运行级别中删除foo,然后启动/停止fooWrapper。该脚本的实现只是我的秘诀+调用/etc/init.d/foo。这样做的麻烦又是软件包升级,foo 是否会将自己重新插入到各种运行级别中,然后我最终会运行两个冲突的副本。

【问题讨论】:

    标签: bash debian init.d debian-based


    【解决方案1】:

    您的设置建议您使用 sysv init 而不是 systemd。如果是这种情况,请继续阅读。否则忽略此答案。

    一般来说,/etc/rc.d/rc3.d 中会有一个类似S20foo 的链接。 20 和 3 对您来说可能不同。通常,您会创建一个脚本/etc/init.d.pre_foo,它会获取您的额外配置并将其链接到/etc/rc.d/rc3.d/S19pre_foo。这将在foo 之前开始pre_foo

    【讨论】:

    • 这听起来是正确的答案,也是一种非常有用的方法。只是为了澄清一下,是什么让这项工作成为 S19
    • 另外,如果我使用这种方法执行service restart foo,它似乎不会重新运行预挂钩。对吗?
    • 是的,两者都是正确的。另外:请注意,这不是 systemd。
    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多