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)
我最终做的是在安装软件包时模拟 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-daemon
and initctl
,所以我也照做了。
归档时间: |
|
查看次数: |
29528 次 |
最近记录: |