Instalar pacotes sem iniciar processos e serviços em segundo plano

37

Às vezes, a instalação de alguns aplicativos iniciará um processo ou serviço do aplicativo que está sendo executado automaticamente na instalação. Como faço para instalar sem iniciá-los?

    
por Oxwivi 31.10.2011 / 13:24

6 respostas

33

Existe uma maneira um pouco agressiva, mas bastante confiável, de fazer isso que estou usando há algum tempo em um script de instalação automatizado.

Primeiro crie um diretório, por exemplo, /root/fake , que contém links simbólicos para /bin/true chamado:

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

Você também pode transformá-los em scripts que não fazem nada e retornam o sucesso.

Em seguida, inclua esse diretório na frente de $PATH ao instalar os pacotes:

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

Isso só impede que os daemons iniciem / reiniciem, enquanto coisas como criar um initramfs ainda estão sendo feitas.

Explicação

Os scripts que estão sendo executados na instalação e remoção do pacote executam invoke-rc.d ou outros dos comandos mencionados para iniciar e parar serviços. Eles, no entanto, não os chamam de caminhos absolutos (pelo menos eu não encontrei um que faça isso).

Então, inserindo os comandos "no operation" falsificados no início de $PATH , os comandos reais nunca são chamados.

Como somente os comandos usados para iniciar / parar serviços estão sendo falsificados, todo o resto, em particular tarefas importantes como atualização / criação de initramfs-images ainda funcionam.

    
por bseibold 09.11.2011 / 17:34
26

Os daemons de segundo plano são iniciados com invoke-rc.d , o que garante que o daemon não seja iniciado se o script rc disser que não deve ser executado no nível de execução atual do sistema. Você pode substituir sua ideia do nível de execução atual do sistema definindo a variável de ambiente RUNLEVEL. Nada deve ser executado nos runlevels 0 e 6, mas parece que invoke-rc.d está com bugs e executa as coisas de qualquer forma se você usar esses runlevels. A maioria dos daemons não são executados no nível de execução 1, portanto, você pode impedi-los de serem iniciados na instalação assim:

sudo RUNLEVEL=1 apt-get install redis-server
    
por psusi 04.11.2011 / 21:21
16

Existe uma solução melhor :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
    
por GnunuX 23.07.2014 / 17:43
4

Acredito que você precise usar a opção de linha de comando --no-triggers quando fizer a dpkg install. Algo parecido com isto:

dpkg -i --no-triggers SomeBigPackage.deb

Para tornar esta configuração persistente para que apt-get install não execute nenhum acionador, crie um arquivo de configuração personalizado do dpkg em /etc/dpkg/dpkg.cfg.d/custom :

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

Note que o dpkg ainda registra os gatilhos como tendo sido executados mesmo que não tenham:

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

Como alternativa, você pode fazer com que o script do instalador execute o comando service para desativar o novo serviço:

service name_of_service stop
    
por dan_linder 01.11.2011 / 21:05
3

O que acabei fazendo foi emular o que o debootstrap faz ao instalar pacotes, exceto que eu usei o dpkg-divert:

Primeiro, mova os arquivos reais para fora do caminho:

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

Em seguida, crie versões fictícias:

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"

Em seguida, faça as atualizações, instalações, etc. do apt-get e, em seguida, limpe com:

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

Eu sei que existem outros comandos que podem ser usados para parar / iniciar serviços, mas o debootstrap só se preocupa com start-stop-daemon e initctl , então eu fiz o mesmo.

    
por Tal 16.11.2012 / 20:00
3

Um verso rápido:

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
    
por pl1nk 26.11.2012 / 01:56

Tags