Я хочу запустить соединение ppp, когда подключен мой USB-модем, поэтому я использую это udev
правило:
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="16d8",\
RUN+="/usr/local/bin/newPPP.sh $env{DEVNAME}"
(Мой модем появляется в /dev
виде ttyACM0
)
newPPP.sh:
#!/bin/bash
/usr/bin/pon prov $1 >/dev/null 2>&1 &
Проблема:
В udev
срабатывает событие, и newPPP.sh работает, но newPPP.sh
процесс был убит после ~ 4-5s. ppp
не успевает подключиться (время ожидания составляет 10 секунд).
Как я могу запустить длительный процесс, который не будет убит?
Я пытался использовать nohup
, но это тоже не сработало.
Система: Arch Linux
Обновить
Я нашел решение здесь , благодаря maxschlepzig .
Я использую, at now
чтобы запустить свою работу отдельно от процесса udev.
Но один вопрос остается без ответа: почему nohup
и &
не работает?
Shell имеет возможность запускать команды в фоновом режиме:
Команды, сгруппированные по скобкам с амперсандом после них, будут выполняться асинхронно в подоболочке. Я использую это для автоматического подключения, когда USB-модем вставлен и переключен. Это занимает около 20 секунд и прекрасно работает под Udev.
источник
Я получил его для работы с setsid. Моя RUN часть правила udev:
тогда в сценарии:
Первый вызов сценария возвращается с состоянием выхода 0, но второй вызов сценария продолжает выполняться с PPID = 1.
источник
Возможно, потому что его родительский процесс завершен, и сигнал завершения распространяется на его дочерние элементы, которые не блокируют его (и в случае, если
SIGKILL
они даже не могут).источник