使用 rc.status 的 Bash 脚本在较新的 SLES 上执行两次

Posted

技术标签:

【中文标题】使用 rc.status 的 Bash 脚本在较新的 SLES 上执行两次【英文标题】:Bash script using rc.status executing twice on newer SLES 【发布时间】:2018-04-17 20:17:21 【问题描述】:

我有一个奇怪的现象,当我们从 SLES 11 迁移到 SLES 12 (SuSE Enterprise Linux) 时,一个长期存在的管理脚本开始或多或少地运行两次。我可以通过一个最小的示例test.sh 将其归结为与/etc/rc.status 相关:

#!/bin/bash
echo Sourcing rc.status
. /etc/rc.status
echo End of script

当使用status 作为参数运行时(我的脚本的常见用例)...

./test.sh status

...我观察到这个输出:

Sourcing rc.status
Sourcing rc.status
End of script
End of script

什么给了?

【问题讨论】:

【参考方案1】:

原来在 SLES /etc/rc.status 文件中有一些诗歌:

user@host:~> diff rc.status.sles11 /etc/rc.status
34a35,92
> # Check if the service is used under systemd but not started with
> if test -z "$SYSTEMD_NO_WRAP" && /usr/bin/mountpoint -q /sys/fs/cgroup/systemd; then
>     if test $PPID -ne 1 -a $# -eq 1 ; then
>       _rc_base=
...

所以解决方案是在采购/etc/rc.status之前设置SYSTEMD_NO_WRAP

#!/bin/bash
echo Sourcing rc.status
SYSTEMD_NO_WRAP=1
. /etc/rc.status
echo End of script

这给出了预期的行为:

Sourcing rc.status
End of script

【讨论】:

以上是关于使用 rc.status 的 Bash 脚本在较新的 SLES 上执行两次的主要内容,如果未能解决你的问题,请参考以下文章

为啥在较新的 Android 设备上预检失败,但在较旧的设备和台式机上却没有?

在 android 中获取位置无法在较新的设备上运行

使用3D Touch防止在较新的iPad上拖动图像和链接

在较新的 PHP 版本中使用具有相同 CSS 选择器名称的 PHP 变量时出现问题

Mono 本机二进制包无法在较新的 Linux 内核中加载 libc

FCM - 为啥在较新的 Firebase Admin SDK 中不再支持 FCM 直接通道?