Debian - como executar um script na inicialização assim que houver uma conexão com a internet pronta para uso?

10

Estou executando o Debian 7 Wheezy e preciso iniciar algumas telas na inicialização assim que houver uma conexão de internet totalmente funcional. No entanto, não, se a conexão com a internet quebrou e foi conectada novamente. Então, somente na primeira conexão de internet funcional após a inicialização.

Você poderia por favor postar um roteiro falso para isso e me dizer onde colocá-lo e fazê-lo ser executado sob as condições dadas?

O script precisa apenas iniciar a tela e terminar, mas a tela deve continuar.

EDITAR Eu já ouvi falar da pasta /etc/network/if-up.d/ . Mas como posso ter certeza de que o script não será executado novamente se a conexão com a Internet for perdida e, em seguida, restabelecida?

    
por MinecraftShamrock 06.11.2014 / 21:54

3 respostas

15

Coloque seu script em /etc/network/if-up.d e torne-o executável. Ele será executado automaticamente toda vez que uma interface de rede aparecer.

Para fazê-lo funcionar apenas na primeira vez que for executado em cada inicialização, verifique se existe um arquivo de sinalização que você criou após a primeira vez. Exemplo:

#!/bin/sh

FLAGFILE=/var/run/work-was-already-done

case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when some other interface comes up
        exit 0
        ;;
    *)
        ;;
esac

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

: here, do the real work.
    
por 06.11.2014 / 22:07
5

Este é um trabalho muito adequado para systemd .

Executando um script como um serviço systemd

Se o seu sistema estiver executando systemd , você poderá configurar seu script para ser executado como um serviço systemd que fornece controle sobre o ciclo de vida e o ambiente de execução, bem como condições prévias para iniciar o script, como a rede em funcionamento.

Crie seu arquivo de unidade do systemd em /lib/systemd/system , por exemplo com vim /lib/systemd/system/autossh.service :

[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Agora você pode testar o serviço:

systemctl start autossh

Verificando o status do serviço:

systemctl status autossh

Parando o serviço:

systemctl stop autossh

Depois de verificar se o serviço funciona como esperado, ative-o com:

systemctl enable autossh

NOTE: For security purposes systemd will run the script in a restricted environment, similar to how crontab scripts are run, therefore don't make any assumptions about pre-existing system variables such as $PATH. Use the Environment keys if your script needs specific variables to be defined. Adding set -x at the top of your bash script and then running systemctl status my_service might help identify why your script is failing. As a rule of tumb, always use absolute paths for everything including echo, or explicitly define your $PATH.

    
por 28.10.2017 / 17:25
2

A conexão com a Internet é ativada por uma entrada em /etc/rc6.d/ probably S35networking . Se você alterar esse arquivo e inserir seus comandos no final, ou melhor adicionar um /etc/init.d/mystuff e link /etc/rc0.d/S36mystuff a ele e inserir seus comandos lá, então isso será iniciado assim que a rede estiver ativa.

    
por 06.11.2014 / 22:03