Je veux exécuter une connexion ppp lorsque mon modem USB est connecté, j'utilise donc cette udev
règle:
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="16d8",\
RUN+="/usr/local/bin/newPPP.sh $env{DEVNAME}"
(Mon modem apparaît en /dev
tant que ttyACM0
)
newPPP.sh:
#!/bin/bash
/usr/bin/pon prov $1 >/dev/null 2>&1 &
Problème:
L' udev
événement se déclenche et newPPP.sh est en cours d'exécution, mais le newPPP.sh
processus est tué après ~ 4-5 secondes. ppp
n'a pas le temps de se connecter (son délai d'attente est de 10 secondes pour la connexion par ligne commutée).
Comment puis-je exécuter un processus de longue durée, qui ne sera pas tué?
J'ai essayé d'utiliser nohup
, mais cela n'a pas fonctionné non plus.
Système: Arch Linux
Mise à jour
J'ai trouvé une solution ici , grâce à maxschlepzig .
J'utilise at now
pour exécuter mon travail indépendamment du processus udev.
Mais la seule question reste sans réponse: pourquoi fonctionne nohup
et &
ne fonctionne pas?
Shell a la capacité d'exécuter des commandes en arrière-plan:
Les commandes regroupées par les accolades avec esperluette après elles seront exécutées de manière asynchrone dans un sous-shell. Je l'utilise pour me connecter automatiquement lorsqu'un modem USB est inséré et commuté. Cela prend environ 20 secondes et fonctionne bien sous udev.
la source
Je l'ai fait fonctionner avec setsid. Ma partie RUN de la règle udev:
puis dans le script:
Le premier appel au script renvoie avec l'état de sortie 0, mais le deuxième appel au script continue de fonctionner avec PPID = 1.
la source
Probablement parce que son processus parent est terminé et que le signal de terminaison se propage à ses enfants, qui ne le bloquent pas (et dans le cas où
SIGKILL
ils ne le peuvent même pas).la source