在不启动后台进程和服务的情况下安装包

Oxw*_*ivi 45 apt

有时,安装某些应用程序会从安装时自动运行的应用程序启动进程或服务。如何在不启动它们的情况下安装?

bse*_*old 34

有一种稍微有点hackish但非常可靠的方法来做到这一点,我已经在自动安装脚本中使用了一段时间。

首先创建一个目录,例如/root/fake,其中包含到/bin/true被调用的符号链接:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper
Run Code Online (Sandbox Code Playgroud)

您还可以使它们成为什么都不做并返回成功的 bash 脚本。

然后$PATH在安装软件包时将该目录包含在前面:

PATH=/root/fake:$PATH apt-get install whatever
Run Code Online (Sandbox Code Playgroud)

这只会阻止守护进程启动/重新启动,而诸如创建 initramfs 之类的事情仍在进行中。

解释

在包安装和删除时正在执行的脚本执行invoke-rc.d或其他提到的命令来启动和停止服务。然而,他们不会用绝对路径来调用它们(至少我没有遇到过这样的)。

因此,通过在 开头插入伪造的“无操作”命令$PATH,真正的命令永远不会被调用。

由于只有用于启动/停止服务的命令被伪造,其他一切,特别是更新/创建 initramfs-images 等重要任​​务仍然有效。


psu*_*usi 28

后台守护进程以 启动invoke-rc.d,这确保守护进程在其 rc 脚本说它不应该在当前系统运行级别运行时不会启动。您可以通过设置环境变量 RUNLEVEL 来覆盖其当前系统运行级别的想法。什么都不应该在运行级别 0 和 6 中运行,但是invoke-rc.d如果您使用这些运行级别,它似乎有问题并且无论如何都可以运行。大多数守护进程不在运行级别 1 中运行,因此您可以防止它们在安装时启动,如下所示:

sudo RUNLEVEL=1 apt-get install redis-server
Run Code Online (Sandbox Code Playgroud)


小智 22

一个更好的解决方案

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案,但不幸的是,不完整。首先,`/usr/sbin/policy-rc.d` 可能已经存在,这个解决方案不会检查它。其次,其他软件包可能会发布自己的`/usr/bin/policy-rc.d`,因此您应该使用 dpkg-divert 来防止这种情况发生。最后,根据 FHS 政策,您不应该自己将东西放入 /usr/sbin。相反,包 policy-rcd-declarative 和 policyrcd-script-zg2 将让您以声明方式管理 /usr/sbin/policy-rc.d。 (4认同)

Tal*_*Tal 5

我最终做的是在安装软件包时模拟 debootstrap 的作用,除了我使用了 dpkg-divert:

首先将真实文件移开:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl
Run Code Online (Sandbox Code Playgroud)

然后创建虚拟版本:

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"
Run Code Online (Sandbox Code Playgroud)

然后进行 apt-get 升级、安装等,然后使用以下命令进行清理:

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon
Run Code Online (Sandbox Code Playgroud)

我知道还有其他命令可以用来停止/启动服务,但是 debootstrap 只关心start-stop-daemonand initctl,所以我也照做了。