安装包而无需启动后台进程和服务
有时安装某些应用程序将从安装时自动运行的应用程序启动进程或服务。 如何在不启动的情况下安装?
有一种稍微讨厌,但非常可靠的方法,我已经在自动安装脚本中使用了一段时间。
首先创建一个目录,例如/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-images等重要任务仍然有效。
后台守护进程是使用invoke-rc.d
启动的,如果它的rc脚本说它不应该在当前系统运行级别中运行,它确保守护进程没有启动。 您可以通过设置环境变量RUNLEVEL来覆盖其当前系统运行级别的概念。 什么都不应该在运行级别0和6中运行,但似乎invoke-rc.d
是错误的,并且如果你使用这些运行级别,无论如何都会运行。 大多数守护进程不在运行级别1中运行,因此您可以阻止它们在安装时启动,如下所示:
sudo RUNLEVEL=1 apt-get install redis-server
有一个更好的解决方案 :
cat > /usr/sbin/policy-rc.d <
我相信在执行dpkg
安装时需要使用--no-triggers
命令行选项。 像这样的东西:
dpkg -i --no-triggers SomeBigPackage.deb
要使此设置保持持久以便apt-get install
不运行任何触发器,请在/etc/dpkg/dpkg.cfg.d/custom
创建自定义dpkg配置文件:
# Install packages without starting background processes and services # See http://askubuntu.com/q/74061 no-triggers
请注意,dpkg仍会将触发器记录为已运行,即使它们没有:
$ sudo apt-get install redis-server … Starting redis-server: redis-server. $ service redis-server status redis-server is not running
或者,您可以让安装程序脚本运行service
命令以关闭新服务:
service name_of_service stop
我最终做的是模拟debootstrap在安装软件包时所做的事情,除了我使用dpkg-divert:
首先将真实文件移开:
dpkg-divert --add --rename --local /sbin/start-stop-daemon dpkg-divert --add --rename --local /sbin/initctl
然后创建虚拟版本:
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"
然后进行apt-get升级,安装等,然后清理:
rm /sbin/initctl /sbin/start-stop-daemon dpkg-divert --remove --rename /sbin/initctl dpkg-divert --remove --rename /sbin/start-stop-daemon
我知道还有其他命令可以用来停止/启动服务,但debootstrap只关心start-stop-daemon
和initctl
,所以我也跟着。
快速单行:
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