Escrevendo um script para cinza?

0

Minha VPN está se comportando de maneira estranha às vezes, e tenho que reiniciá-la com frequência. Eu queria escrever um roteiro que faz isso para mim. Não precisa ser nada extravagante, apenas um atalho para os comandos que tenho que digitar no terminal. Mais especificamente: ele examinará os processos em execução. Se encontrar um processo vpnc em execução, ele será eliminado. Então vai começar o vpnc.

Eu escrevi scripts bash de complexidade semelhante, mas agora eu não tenho um bash, apenas uma cinza. Até agora, a única diferença que notei é que há muito menos comandos disponíveis, mas eu não uso isso com muita frequência. Então eu tenho algumas perguntas.

  1. Está escrevendo scripts de cinzas diferentes que escrever scripts bash?
  2. Existe algo específico para considerar ao fazer isso?
  3. Quando o script está pronto, como posso implantá-lo? Por bash, acabei de colocar o arquivo executável em / usr / lib e execute-o digitando o nome do arquivo na linha de comando, isso trabalhar com cinzas?
  4. Há alguma armadilha especial para atente para o script que eu quero escrever? Eu acho que o assassinato parte do processo pode ficar peludo, se eu escreva algo que mate o errado processo, mas mesmo assim executando o roteiro não deve quebrar nada permanentemente, certo?
por rumtscho 25.03.2010 / 16:28

2 respostas

2

Eu duvido que exista algo bash específico nisso, a maior parte da "magia" está nos comandos externos. Então, algo como:

#!/bin/ash  
pgrep vpnc >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
    /etc/init.d/vpnc stop
    sleep 1
    pkill vpnc
    sleep 1
    pkill -9 vpnc
    sleep 1
    /etc/init.d/vpnc start
fi

Trabalhará supondo que você tenha o pgrep e o pkill instalados e que seu script de inicialização seja chamado vpnc e resida em /etc/init.d (e que ash mora em /bin ). Largá-lo em qualquer lugar em $PATH , defina o bit de execução ( chmod +x myscript ) e você simplesmente tem que chamá-lo pelo nome que você salvou como.

Os binários (e scripts) tradicionalmente instalados residiriam em /usr/local/bin , não em /usr/lib . Se isso não existir e não estiver no seu atual $PATH , basta criar o diretório ( mkdir -p /usr/local/bin ) e editar o arquivo que define $PATH (provavelmente algo abaixo de /etc ).

Note que com um pouco de esforço você pode incluir isso em um script que faça algo como:

#!/bin/ash
pgrep vpnc
if [ $? -eq 0 ]; then
    ping -n -q -c 4 ip.at.other.side
    if [ $? -ne 0 ]; then
        /usr/local/bin/myscript
    fi
fi

Chame isso de cron a cada N minutos e, quando a VPN estiver rodando e o ping para o IP do outro lado falhar, ela reiniciará a VPN.

Cuidado - Eu simplesmente joguei tudo junto da experiência, nenhum teste foi feito e eu nunca usei cinzas. Alguns ajustes ou retrabalhos podem ser necessários.

Ok, se você não tiver o cron, você pode incluir o segundo script como:

#!/bin/ash
while [ true ]; do
    pgrep vpnc
    if [ $? -eq 0 ]; then
        ping -n -q -c 4 ip.at.other.side
        if [ $? -ne 0 ]; then
            /usr/local/bin/myscript
        fi
    fi
sleep 60
done

Para que seja executado em segundo plano, use nohup :

nohup /usr/local/bin/mywrapper &

Você deve descobrir que há pelo menos um servidor que responde ao ping, possivelmente até mesmo ao ponto de extremidade da VPN. Se isso não funcionar, tente os servidores DNS ou roteadores (as pessoas raramente bloqueiam os roteadores).

    
por 25.03.2010 / 17:55
0

Para completar, o script atual que usei:

#! /bin/ash
pgrep vpnc >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
 pkill vpnc
 sleep 1
fi
vpnc /etc/vpnc/hybrid.conf

em que hybrid.conf é o arquivo de configuração do cliente vpnc. Eu gostaria de aprender mais sobre scripts, então se alguém perceber um exemplo de má prática aqui, por favor me fale sobre isso.

    
por 25.03.2010 / 20:02