Intereting Posts

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

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

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

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

Фоновые демоны запускаются с помощью 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 <<EOF #!/bin/sh exit 101 EOF chmod a+x /usr/sbin/policy-rc.d 

Я считаю, что вам нужно использовать опцию командной строки --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 

То, что я закончил, – это эмуляция того, что делает 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" 

Затем выполните ваши аппетитные обновления, установки и т. Д., А затем очистите:

 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