Иногда при установке некоторых приложений процесс или служба запускаются из приложения, которое автоматически запускается при установке. Как мне установить их без запуска?
Существует лучшее решение :
cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
Фоновые демоны запускаются с invoke-rc.d
, который гарантирует, что демон не запускается, если его скрипт rc сообщает, что он не должен работать на текущем уровне запуска системы. Вы можете переопределить его представление о текущем уровне выполнения системы, установив переменную среды RUNLEVEL. Ничто не должно запускаться на уровнях запуска 0 и 6, но, похоже, что invoke-rc.d
содержит ошибки и все запускает, если вы используете эти уровни запуска. Большинство демонов не запускаются на уровне выполнения 1, поэтому вы можете запретить их запуск при установке следующим образом:
sudo RUNLEVEL=1 apt-get install redis-server
Быстрый однострочник:
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
В итоге я эмулировал то, что делает 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
, поэтому я последовал их примеру.
Я полагаю, что необходимо использовать --no-triggers
параметр командной строки, когда Вы делаете dpkg
установка. Что-то вроде этого:
dpkg -i --no-triggers SomeBigPackage.deb
Устанавливать эту настройку, персистентную так, чтобы apt-get install
не выполняет триггеров, создает пользовательский dpkg конфигурационный файл в /etc/dpkg/dpkg.cfg.d/custom
:
# 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
Есть немного хакерский, но довольно надежный способ сделать это, который я использовал некоторое время в сценарии автоматической установки.
Сначала создайте каталог, например /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-образов, все еще работают.