Kilka moich regularnych programów ulega awarii (regularnie) z komunikatem „Sygnał 1 zdefiniowany przez użytkownika”. Wiem, że istnieje nohuppolecenie, ale czy istnieje nousr1polecenie? A może coś, co zrobi coś takiego, nohupale z USR1?
Kilka moich regularnych programów ulega awarii (regularnie) z komunikatem „Sygnał 1 zdefiniowany przez użytkownika”. Wiem, że istnieje nohuppolecenie, ale czy istnieje nousr1polecenie? A może coś, co zrobi coś takiego, nohupale z USR1?
Odpowiedzi:
Proste hacky rozwiązanie, które ma narzędzie analogiczne do nohup, ale dla SIGUSR1, byłoby pobrać kopię źródła coreutils , rozpakuj go, zrób
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, opcjonalnie zmień także nazwę pliku wyjściowego
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, skompiluj to źródło i zainstaluj nowo skompilowany nohupplik binarny do /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Następnie, jak sprawdziłem, sleep 1000wychodzi USR1, a jednocześnie nousr1 sleep 1000jest odporny na ten sygnał.
nohupNawiasem mówiąc, główną funkcją jest oddzielenie procesu od terminala, aby nie był wysyłany SIGHUP. To, że konfiguruje również procedurę obsługi sygnału, jest dodatkowym bonusem, ale powinno być niepotrzebne.
signal(SIGHUP,SIG_IGN);połączenie nohup.c, proces odbierze SIGHUP. Co nohuprobi oprócz ignorując sygnał jest tylko ponowne otwarcie stdin, stdout, stderr jak deskryptory plików nieterminalnymi. Nie oddziela tak naprawdę procesu od terminala w żaden szczególny sposób. Tj. Proces zostanie wysłany, SIGHUPgdy terminal się rozłączy. Z drugiej strony jest bash, który robi podobne rzeczy z disownpoleceniem, ale nie jestem pewien, jak to jest zaimplementowane - może w sposób, w jaki masz na myśli.
A co z trapwbudowanym poleceniem powłoki ?
trap 'echo "Thou shalt not USR1 me"' USR1
Musisz użyć formy trappolecenia z pustym argumentem. Spróbuj tego:
trap '' SIGUSR1; myprogram
To zignoruje sygnał SIGUSR1, który właśnie próbujesz zrobić. Chociaż zgadzam się z komentatorami, że prawdopodobnie dzieje się tutaj więcej niż na pierwszy rzut oka.
Niepoprawna forma:
trap 'echo ...' SIGUSR1; myprogram
nadal pozwoli myprogramna otrzymanie SIGUSR1, ale powłoka wykona następnie polecenie echoz trappolecenia.
trap '' SIGUSR1; gvimdiff file1 file2i Vim zmarł z „vim: Caught śmiertelnie sygnalizować USR1”.