Estritamente falando, uma resposta:
Muitos programas, quando canalizados em algum lugar, armazenam em buffer sua saída - eles escrevem várias linhas de uma só vez. Isso aumenta o desempenho, mas, obviamente, quebra suas tentativas de grep
da saída. O GNU Coreutils inclui um utilitário stdbuf
, que geralmente permite alterar isso. Você deseja alterar stdout ou stderr para line-buffered. Isso pode funcionar, mas provavelmente não é a melhor solução.
Uma maneira melhor:
Se você procurar em /etc/ppp
, verá vários scripts, incluindo /etc/ppp/ip-up
. Quando o link PPP aparece, o pppd executa esse script. Pelo menos no Debian, esse script então executa todos os scripts em /etc/ppp/ip-up.d/
.
Portanto, a solução muito mais simples é colocar seu script de shell em /etc/ppp/ip-up.d/
ou editar (ou criar, se ele não existir) /etc/ppp/ip-up
. Existe similarmente um …ipv6-up
, e também …-down
variantes também. Existem mais alguns; verifique a % "Scripts" da página% depppd
da página para obter detalhes.
Tenha em mente que você pode simplesmente usar o script up para sinalizar seu script (ou algum outro) de que o link está pronto - ele não precisa fazer o trabalho em si. Por exemplo, você pode sinalizar com algo tão simples quanto kill -USR1 other-script-pid
e, em seguida, usar trap
& sleep
para aguardar esse sinal. Ou você pode abrir um pipe nomeado ("fifo", por exemplo, mkfifo
) para leitura (que bloqueará até que haja um gravador) e, em seguida, tenha o script up apenas echo alive > /path/to/fifo
. Ou talvez ecoar o endereço IP ou outras informações úteis. Ou seu script poderia kill -STOP $$
e, em seguida, seu script para cima poderia kill -CONT script-pid
. Existem várias maneiras de conseguir isso. (Você pode até mesmo sair e usar o dbus.)