如何在不停止服务的情况下删除提供服务的包?

Nat*_*man 4 uninstall services

我目前有uwsgi安装 uwsgi安装包。我想删除该包但保持当前的 uWSGI 实例运行。这可能吗?

(是的,我确实意识到该服务只会继续运行,直到它停止或服务器重新启动。)

mur*_*uru 9

prermuwsgi脚本包含以下:

#!/bin/sh
set -e
# Automatically added by dh_installinit
if [ -x "/etc/init.d/uwsgi" ] || [ -e "/etc/init/uwsgi.conf" ]; then
    invoke-rc.d uwsgi stop || exit $?
fi
# End automatically added section
                                                                   
Run Code Online (Sandbox Code Playgroud)

您有几个选择:

编辑prerm脚本。

脚本通常位于/var/lib/dpkg/uwsgi.prerm. 做:

sudo sed -i '/invoke-rc.d/ s/^/#/' /var/lib/dpkg/uwsgi.prerm
Run Code Online (Sandbox Code Playgroud)

注释掉停止服务的命令。

充分利用脚本中的条件

任何一个:

sudo chmod -x /etc/init.d/uwsgi
Run Code Online (Sandbox Code Playgroud)

由于脚本检查此脚本的执行权限,

或者:

mv /etc/init/uwsgi.conf /etc/init/uwsgi.conf.bak
Run Code Online (Sandbox Code Playgroud)

因为脚本会检查此 Upstart 服务文件是否存在。

根据文件列表,该包具有/etc/init.d/uwsgi而不是 Upstart 脚本。

(滥用 policy-rc.d

invoke-rc.d由 控制policy-rc.d。但是,直接使用它是有问题的。该prerm脚本具有exit $?,并且dpkg不喜欢非零退出代码。因此,这仍然需要更改prerm脚本:

echo 'exit 101' > /usr/sbin/invoke-rc.d
chmod +x /usr/sbin/invoke-rc.d
sed 's/exit/echo/' -i /var/lib/dpkg/uwsgi.prerm
Run Code Online (Sandbox Code Playgroud)

为什么我还回答?

已经有一些出色的答案:在不启动后台进程和服务的情况下安装包(可能需要一些轻微的调整)。