有时安装某些应用程序时会自动启动该应用程序的进程或服务。如何在不启动它们的情况下进行安装?
答案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