Chcę uruchomić połączenie ppp, gdy mój modem USB jest podłączony, więc używam tej udev
reguły:
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="16d8",\
RUN+="/usr/local/bin/newPPP.sh $env{DEVNAME}"
(Mój modem pojawia się /dev
jako ttyACM0
)
newPPP.sh:
#!/bin/bash
/usr/bin/pon prov $1 >/dev/null 2>&1 &
Problem:
W udev
Zdarzenie, a newPPP.sh jest uruchomiony, ale newPPP.sh
proces jest zabity po ~ 4-5s. ppp
nie ma czasu na połączenie (limit czasu wynosi 10 sekund na połączenie dial-up).
Jak mogę uruchomić długi proces, który nie zostanie zabity?
Próbowałem użyć nohup
, ale to też nie działało.
System: Arch Linux
Aktualizacja
Tutaj znalazłem rozwiązanie , dzięki maxschlepzig .
Używam at now
do uruchamiania mojej pracy odłączonej od procesu udev.
Ale jedno pytanie pozostaje bez odpowiedzi: dlaczego działają nohup
i &
nie działają?
Shell ma możliwość uruchamiania poleceń w tle:
Polecenia pogrupowane według nawiasów klamrowych po nich będą wykonywane asynchronicznie w podpowłoce. Używam tego do automatycznego łączenia, gdy modem USB jest podłączony i przełączany. To zajmuje około 20 sekund i działa dobrze pod udev.
źródło
Mam go do pracy z Setsem. Moja RUN część reguły udev:
następnie w skrypcie:
Pierwsze wywołanie skryptu powraca ze statusem wyjścia 0, ale drugie wywołanie skryptu nadal działa z PPID = 1.
źródło
Prawdopodobnie dlatego, że proces macierzysty został zakończony, a sygnał zakończenia propaguje się do jego dzieci, które go nie blokują (a
SIGKILL
nawet jeśli nie mogą).źródło