W wielu przypadkach gryzą Cię niewielkie różnice między środowiskami. To jest ten, na który ostatnio pobiegłem. Jaka jest różnica między tymi dwoma poleceniami?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
Odpowiedź jest taka sama jak zwykle - to zależy.
nohup przechwytuje sygnał rozłączenia, podczas gdy znak ampersand nie.
Co to jest sygnał rozłączenia?
SIGHUP - zawieszenie wykryte podczas kontrolowania terminala lub śmierć procesu kontrolowania (wartość: 1).
Zwykle po uruchomieniu polecenia za pomocą & i wyjściu z powłoki, powłoka zakończy polecenie podrzędne sygnałem rozłączenia (np. Kill -SIGHUP $ PID). Można temu zapobiec za pomocą nohup, ponieważ przechwytuje on sygnał i ignoruje go, aby nigdy nie dotarł do rzeczywistej aplikacji.
Dobrze, ale jak w tym przypadku zawsze są „ale”. Nie ma różnicy między tymi metodami uruchamiania, gdy powłoka jest skonfigurowana w taki sposób, że w ogóle nie wysyła SIGHUP.
Jeśli używasz bash, możesz użyć polecenia podanego poniżej, aby dowiedzieć się, czy twoja powłoka wysyła SIGHUP do swoich procesów potomnych, czy nie:
~ $ shopt | grep hupon
A ponadto - są przypadki, w których nohup nie działa. Na przykład, gdy proces, który zaczynasz, ponownie łączy sygnał NOHUP (odbywa się to wewnątrz, na poziomie kodu aplikacji).
W opisanym przypadku brak różnic ugryzł mnie, gdy w skrypcie uruchamiającym usługę niestandardową było wywołanie drugiego skryptu, który konfiguruje i uruchamia odpowiednią aplikację bez polecenia nohup.
W jednym środowisku Linuksa wszystko działało sprawnie, w drugim aplikacja została zamknięta, gdy tylko drugi skrypt się zakończył (wykrycie tego przypadku zajęło mi oczywiście dużo więcej czasu, niż mogłoby się wydawać: stuck_out_tongue :).
Po dodaniu nohup jako metody uruchamiania do drugiego skryptu aplikacja działa nadal, nawet jeśli skrypty zostaną zamknięte, a zachowanie to stało się spójne w obu środowiskach.