45 votes

Installer des packages sans démarrer de processus en arrière-plan et de services

Parfois, l'installation de certaines applications lancera automatiquement un processus ou un service de l'application lors de l'installation. Comment puis-je installer sans les démarrer ?

34voto

bseibold Points 1513

Il existe un moyen un peu hackish, mais assez fiable pour faire cela que j'utilise depuis un certain temps dans un script d'installation automatisé.

Créez d'abord un répertoire, par exemple /root/fake, qui contient des liens symboliques vers /bin/true appelés:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

Vous pouvez également en faire des scripts bash qui ne font rien et renvoient un succès.

Ensuite, incluez ce répertoire au début de $PATH lors de l'installation des packages:

PATH=/root/fake:$PATH apt-get install whatever

Cela empêche uniquement les démons de démarrer/redémarrer, tandis que des tâches comme la création d'un initramfs continuent d'être effectuées.

Explication

Les scripts exécutés lors de l'installation et de la désinstallation des packages exécutent invoke-rc.d ou d'autres commandes mentionnées pour démarrer et arrêter les services. Cependant, ils ne les appellent pas avec des chemins absolus (du moins je n'ai pas encore rencontré un cas où c'est le cas).

En insérant les commandes "no operation" falsifiées au début de $PATH, les vraies commandes ne sont jamais appelées.

Comme seules les commandes utilisées pour démarrer/arrêter les services sont falsifiées, tout le reste, en particulier des tâches importantes comme la mise à jour/création d'images initramfs, continuent de fonctionner.

28voto

psusi Points 35613

Les démons d'arrière-plan sont démarrés avec invoke-rc.d, ce qui garantit que le démon ne sera pas démarré si son script rc indique qu'il ne doit pas s'exécuter dans le niveau d'exécution système actuel. Vous pouvez outrepasser son idée du niveau d'exécution système actuel en définissant la variable d'environnement RUNLEVEL. Rien n'est censé être exécuté dans les niveaux d'exécution 0 et 6, mais il semble que invoke-rc.d soit buggé et exécute quand même des choses si vous utilisez ces niveaux d'exécution. La plupart des démons ne s'exécutent pas dans le niveau d'exécution 1, vous pouvez donc les empêcher d'être démarrés à l'installation comme ceci:

sudo RUNLEVEL=1 apt-get install redis-server

22voto

GnunuX Points 221

Il existe une meilleure solution :

cat > /usr/sbin/policy-rc.d <

5voto

Tien Do Points 1262

Ce que j'ai fini par faire est d'émuler ce que debootstrap fait lors de l'installation de packages, sauf que j'ai utilisé dpkg-divert :

D'abord déplacez les vrais fichiers :

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

Ensuite créez des versions factices :

echo \
"#!/bin/sh
echo
echo \"Attention : Faux start-stop-daemon appelé, ne fait rien\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Attention : Faux initctl appelé, ne fait rien\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

Ensuite faites vos mises à niveau, installations, etc., et enfin nettoyez avec :

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

Je sais qu'il existe d'autres commandes qui peuvent être utilisées pour arrêter/démarrer des services, mais debootstrap se soucie uniquement de start-stop-daemon et initctl, donc j'ai suivi la même logique.

3voto

pl1nk Points 5939

Une rapide ligne de commande :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X