Иногда установка некоторых приложений запускает процесс или службу из приложения, которое запускается автоматически при установке. Как установить без их запуска?
Есть немного хакерский, но вполне надежный способ сделать это, который я использовал некоторое время в сценарии автоматической установки.
Сначала создайте каталог, например /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
Это предотвращает запуск / перезапуск демонов, хотя делаются попытки создания initramf.
Сценарии которые выполняются при установке и удалении пакета, выполняют 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
[d2 ] Обратите внимание, что 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
[d2 ] Затем создайте фиктивные версии: 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, поэтому я следовал примеру.
Быстрый однострочный:
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
Фоновые демона запускаются с помощью 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
Существует лучшее решение :
cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
Существует лучшее решение :
cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d