Installer les paquets sans démarrer les processus et services d'arrière-plan

37

Parfois, l'installation de certaines applications démarrera un processus ou un service à partir de l'application en cours d'exécution automatiquement lors de l'installation. Comment puis-je installer sans les démarrer?

    
posée Oxwivi 31.10.2011 - 13:24
la source

6 réponses

33

Il existe un moyen légèrement piraté, mais tout à fait fiable, de faire cela, que j'utilise depuis un certain temps dans un script d'installation automatisé.

Commencez par créer un répertoire, par exemple /root/fake , qui contient des liens symboliques vers /bin/true appelé:

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

Vous pourriez aussi leur faire des scripts bash qui ne font rien et renvoient le succès.

Incluez ensuite 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, alors que des choses comme la création d’initramfs sont toujours en cours.

Explication

Les scripts en cours d'exécution lors de l'installation et de la suppression du package exécutent invoke-rc.d ou d'autres des commandes mentionnées pour démarrer et arrêter les services. Ils ne les appellent cependant pas avec des chemins absolus (du moins je n'en ai pas rencontré un qui le fait).

Donc, en insérant les fausses commandes "no operation" 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 les tâches importantes telles que la mise à jour / la création d’initramfs-images, fonctionnent toujours.

    
réponse donnée bseibold 09.11.2011 - 17:34
la source
26

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

sudo RUNLEVEL=1 apt-get install redis-server
    
réponse donnée psusi 04.11.2011 - 21:21
la source
16

Il existe une meilleure solution :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
    
réponse donnée GnunuX 23.07.2014 - 17:43
la source
4

Je pense que vous devez utiliser l'option de ligne de commande --no-triggers lorsque vous effectuez l'installation dpkg . Quelque chose comme ça:

dpkg -i --no-triggers SomeBigPackage.deb

Pour rendre ce paramètre persistant afin que apt-get install n'exécute aucun déclencheur, créez un fichier de configuration dpkg personnalisé dans /etc/dpkg/dpkg.cfg.d/custom :

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

Notez que dpkg consigne toujours les déclencheurs comme ayant été exécutés même s’ils ne l’ont pas fait:

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

Vous pouvez également demander au script d'installation d'exécuter la commande service pour désactiver le nouveau service:

service name_of_service stop
    
réponse donnée dan_linder 01.11.2011 - 21:05
la source
3

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

Commencez par déplacer les fichiers réels:

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

Créez ensuite des versions factices:

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"

Ensuite, faites vos mises à jour, installations, etc. apt-get, puis 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 que d’autres commandes peuvent être utilisées pour arrêter / démarrer les services, mais debootstrap ne s’intéresse qu’à start-stop-daemon et initctl , donc j’ai suivi.

    
réponse donnée Tal 16.11.2012 - 20:00
la source
3

Un one-liner rapide:

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
    
réponse donnée pl1nk 26.11.2012 - 01:56
la source

Lire d'autres questions sur les étiquettes