Przeczytałem odpowiedź od użytkownika, który twierdził, że działa
foo 2>&1 >& output.log &
spowoduje foo
kontynuowanie działania nawet po wylogowaniu. Według tego użytkownika działało to nawet w połączeniach SSH.
Naprawdę nie wierzyłem w to, ponieważ miałem wrażenie, że w przypadku rozłączenia się z SSH lub zakończenia TTY powłoka, a zatem jej procesy otrzymają SIGHUP, powodując ich zakończenie. To, przy moim założeniu, było jedynym powodem użycia nohup
w takich przypadkach lub tmux
, screen
i in.
Potem zajrzałem do instrukcji glibc :
Ten sygnał jest także wykorzystywany do zgłaszania zakończenia procesu kontrolowania na terminalu zadaniom związanym z tą sesją; zakończenie to skutecznie odłącza wszystkie procesy w sesji od terminala sterującego.
To wydaje się potwierdzać moje myśli. Ale patrząc dalej, mówi :
Jeśli proces jest liderem sesji, który ma terminal kontrolny, wówczas sygnał SIGHUP jest wysyłany do każdego procesu w zadaniu na pierwszym planie, a terminal kontrolny jest odłączany od tej sesji.
Czy to oznacza, że zadania umieszczone w tle nie otrzymają SIGHUP?
Do mojego dalszego zamieszania, wpadłem sesji interaktywnej zsh Ran yes >& /dev/null &
, a wpisane exit
, gdy zsh ostrzegł mnie, że miałem uruchomiony pracy, a po wpisaniu exit
po raz drugi, powiedział mi, że miał SIGHUPed jedną pracę. Wykonanie dokładnie tego samego w Bash pozostawia pracę uruchomioną…
logout
iyes
nadal działa.Odpowiedzi:
Bash wydaje się wysyłać
SIGHUP
tylko wtedy, gdy sam otrzymał aSIGHUP
, co na przykład występuje, gdy terminal wirtualny jest zamknięty lub gdy połączenie SSH jest przerywane. Z dokumentacji :Więc jeśli napiszesz
exit
lub naciśniesz Ctrl+ Dcały proces w tle pozostanie, ponieważ nie wysyła to sygnału rozłączenia do Bash.Możesz zmusić Basha do ostrzeżenia o tym, że nadal działają procesy w tle
Istnieje opcja wysłania
SIGHUP
wyjścia, jeśli jesteś w interaktywnej powłoce ( patrz tutaj ). Ale to nie działa na moim komputerze z Bash 4.2.25. Może to działa dla ciebieźródło
SIGHUP
wysyłane jest, w przeciwnym razie, z czystym wyjściem, zadania nadal działają? To wyjaśnia, co widziałem.huponexit
działa „tylko w przypadku interaktywnych powłok logowania”