Quero executar uma conexão ppp quando meu modem USB estiver conectado, portanto, uso esta udev
regra:
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="16d8",\
RUN+="/usr/local/bin/newPPP.sh $env{DEVNAME}"
(Meu modem aparece /dev
como ttyACM0
)
newPPP.sh:
#!/bin/bash
/usr/bin/pon prov $1 >/dev/null 2>&1 &
Problema:
O udev
evento é acionado e o newPPP.sh está em execução, mas o newPPP.sh
processo é interrompido após ~ 4-5s. ppp
não tem tempo para se conectar (o tempo limite é 10s para discagem).
Como posso executar um processo de longo prazo, que não será morto?
Eu tentei usar nohup
, mas também não funcionou.
Sistema: Arch Linux
Atualizar
Encontrei uma solução aqui , graças ao maxschlepzig .
Eu uso at now
para executar meu trabalho desanexado do processo udev.
Mas a única pergunta permanece sem resposta: por que funciona nohup
e &
não funciona?
O Shell tem capacidade de executar comandos em segundo plano:
Os comandos agrupados pelos chavetas com e comercial depois deles serão executados de forma assíncrona em um subshell. Eu uso isso para conectar automaticamente quando um modem USB é inserido e comutado. Demora cerca de 20 segundos e funciona bem no udev.
fonte
Eu consegui trabalhar com o setsid. Minha parte RUN da regra do udev:
então no script:
A primeira chamada para o script retorna com o status de saída 0, mas a segunda chamada para o script continua em execução com PPID = 1.
fonte
Provavelmente porque seu processo pai é finalizado e o sinal de finalização se propaga para seus filhos, que não o bloqueiam (e, no caso de
SIGKILL
eles nem conseguirem).fonte