Устанавливать пакеты без запуска фоновых процессов и сервисов

Иногда при установке некоторых приложений процесс или служба запускаются из приложения, которое автоматически запускается при установке. Как мне установить их без запуска?

43
задан 31 October 2011 в 16:24

6 ответов

Существует лучшее решение :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
0
ответ дан 31 October 2011 в 16:24

Фоновые демоны запускаются с invoke-rc.d, который гарантирует, что демон не запускается, если его скрипт rc сообщает, что он не должен работать на текущем уровне запуска системы. Вы можете переопределить его представление о текущем уровне выполнения системы, установив переменную среды RUNLEVEL. Ничто не должно запускаться на уровнях запуска 0 и 6, но, похоже, что invoke-rc.d содержит ошибки и все запускает, если вы используете эти уровни запуска. Большинство демонов не запускаются на уровне выполнения 1, поэтому вы можете запретить их запуск при установке следующим образом:

sudo RUNLEVEL=1 apt-get install redis-server
0
ответ дан 31 October 2011 в 16:24

Быстрый однострочник:

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
0
ответ дан 31 October 2011 в 16:24

В итоге я эмулировал то, что делает 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, поэтому я последовал их примеру.

0
ответ дан 31 October 2011 в 16:24

Я полагаю, что необходимо использовать --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
5
ответ дан 31 October 2011 в 16:24

Есть немного хакерский, но довольно надежный способ сделать это, который я использовал некоторое время в сценарии автоматической установки.

Сначала создайте каталог, например /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-образов, все еще работают.

0
ответ дан 31 October 2011 в 16:24

Другие вопросы по тегам:

Похожие вопросы: