安装软件包而不启动后台进程和服务

安装软件包而不启动后台进程和服务

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

答案1

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

首先创建一个目录,例如/root/fake,其中包含/bin/true指向以下内容的符号链接:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

您还可以让它们成为不执行任何操作并返回成功的 bash 脚本。

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

PATH=/root/fake:$PATH apt-get install whatever

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

解释

在安装和删除软件包时执行的脚本会执行invoke-rc.d上述命令中的其他命令来启动和停止服务。但它们不会使用绝对路径来调用这些命令(至少我还没有遇到过使用绝对路径的脚本)。

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

由于仅伪造了用于启动/停止服务的命令,因此其他一切,特别是更新/创建 initramfs 映像等重要任务仍然有效。

答案2

后台守护进程以 启动invoke-rc.d,这确保如果守护进程的 rc 脚本表明它不应该在当前系统运行级别中运行,则不会启动它。您可以通过设置环境变量 RUNLEVEL 来覆盖其对当前系统运行级别的想法。没有任何东西应该在运行级别 0 和 6 中运行,但似乎存在invoke-rc.d错误,如果您使用这些运行级别,它无论如何都会运行。大多数守护进程不在运行级别 1 中运行,因此您可以像这样阻止它们在安装时启动:

sudo RUNLEVEL=1 apt-get install redis-server

答案3

更好的解决方案

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d

答案4

快速一行:

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d

相关内容