Bash 如何为服务编写包装器脚本

Bash 如何为服务编写包装器脚本,bash,debian,init.d,debian-based,Bash,Debian,Init.d,Debian Based,我有一个系统服务,foo,它通过/usr/sbin/service restart foo启动和停止。它又似乎由shell脚本/etc/init.d/foo 如何创建“预启动”挂钩,以便在启动此服务之前运行额外的shell脚本?在这种情况下,预启动钩子是额外的配置,必须从云提供商元数据目录中获取,然后插入到foo正确启动所需的配置文件中 我已经考虑过直接修改/etc/init.d/foo,这会起作用。但这会使预期的频繁补丁级升级复杂化,我将通过apt-get-upgrade捕获这些升级。我希望避

我有一个系统服务,
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
是否会重新插入到不同的运行级别,然后我会运行两个冲突的副本。

您的设置建议您使用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\u foo

,这听起来是正确的答案,也是一种非常有用的方法。只是想澄清一下,是什么让这项工作能够正常进行的?S19service restart foo,它将不会重新运行预钩子。是吗?是的,两者都是正确的。还有:请注意,这不是系统性的。