Kilka moich regularnych programów ulega awarii (regularnie) z komunikatem „Sygnał 1 zdefiniowany przez użytkownika”. Wiem, że istnieje nohup
polecenie, ale czy istnieje nousr1
polecenie? A może coś, co zrobi coś takiego, nohup
ale z USR1?
12
Odpowiedzi:
Proste hacky rozwiązanie, które ma narzędzie analogiczne do
nohup
, ale dlaSIGUSR1
, byłoby pobrać kopię źródła coreutils , rozpakuj go, zrób, opcjonalnie zmień także nazwę pliku wyjściowego
, skompiluj to źródło i zainstaluj nowo skompilowany
nohup
plik binarny do/usr/bin/nousr1
:Następnie, jak sprawdziłem,
sleep 1000
wychodziUSR1
, a jednocześnienousr1 sleep 1000
jest odporny na ten sygnał.źródło
nohup
Nawiasem mówiąc, główną funkcją jest oddzielenie procesu od terminala, aby nie był wysyłanySIGHUP
. To, że konfiguruje również procedurę obsługi sygnału, jest dodatkowym bonusem, ale powinno być niepotrzebne.signal(SIGHUP,SIG_IGN);
połączenienohup.c
, proces odbierzeSIGHUP
. Conohup
robi 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,SIGHUP
gdy terminal się rozłączy. Z drugiej strony jest bash, który robi podobne rzeczy zdisown
poleceniem, ale nie jestem pewien, jak to jest zaimplementowane - może w sposób, w jaki masz na myśli.A co z
trap
wbudowanym poleceniem powłoki ?źródło
Musisz użyć formy
trap
polecenia z pustym argumentem. Spróbuj tego: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:
nadal pozwoli
myprogram
na otrzymanie SIGUSR1, ale powłoka wykona następnie polecenieecho
ztrap
polecenia.źródło
trap '' SIGUSR1; gvimdiff file1 file2
i Vim zmarł z „vim: Caught śmiertelnie sygnalizować USR1”.