Nie wiedziałem, czy to należy do SO (ponieważ jest to błąd kodowy), ale pomyślałem, że będziecie bardziej kompetentni w zakresie subtelności używanego oprogramowania (więc może nawet U&L może być brany pod uwagę).
Oto minimalny skrypt kodu (zobacz zmiany dla pełnego skryptu, jest powód, dla którego robię to w ten sposób);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Próbuje uruchomić serwer w tle, który generuje plik dziennika.
Potem używam follow
tego pliku dziennika less +F
. Aby to zakończyć, musisz nacisnąć ctrl+, czanim będziesz mógł uderzyć Q.
Co się dzieje, gdy I ctrl+ cwewnątrz less
polecenia (aby zatrzymać tailing
) to w jakiś sposób zabija serwer rozpoczęty nohup
na górze! Nie ma to wpływu na nic innego. Mogę shift+ fponownie rozpocząć dostosowywanie dziennika (który nie otrzymuje żadnych nowych informacji, ponieważ serwer został zabity) i jeśli trafię Qw pozostałą część skryptu, działa normalnie.
Czy wiesz, dlaczego tak się dzieje? Jak tego uniknąć / czegoś innego powinienem używać?
PS
Program serwera może nasłuchiwać ^C
, co może być problemem; czy mogę coś zrobić, aby temu zapobiec? Na przykład, kiedy po prostu biegam {SERVERCOMMAND}
sam (w sposób blokujący), mogę nacisnąć ctrl+ c, co nie natychmiast go zabije; drukuje Received ^C signal, shutting down
(a następnie sam się zabija). To co się dzieje, kiedy ^C
w less
(A końcowy Received ^C signal, shutting down
jest zapisywane w dzienniku).
PPS
Próbowałem wielu rzeczy (nic nie działało);
próba odłączenia stdin od skryptu poprzez zmianę
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
używając
stty intr ^G
do zastąpienia polecenia przerwania, ale ctrl+ gi tak zrobił dokładnie to, co^C
robił (więc może to być problem z moim emulatorem terminala;konsole
)umieszczanie linii
nohup
i / lubless
wiersza w nawiasach (aby była to podpowłoka)uruchamianie skryptu
xterm
zamiastkonsole
I think it is due to the handling within the database software, not on the shell
. Jak miałby to zrobić program? Jak więc mogę to zatrzymać?nohup
zapobiega odbiorzeSIGHUP
sygnału przez proces , podczas gdy CTRL + C wysyłaSIGINT
sygnał. Dlategonohup
nie ma oczekiwanego efektu.Odpowiedzi:
Miałem rację, myśląc, że był
SIGINT
wysyłany do wszystkich procesów, gdy ctrl+ c, ale głupio pomyślałem, że wykonanie innego procesu wyprowadziłoby go pozaprocess group
(patrz moje próby wP.P.S.
).Jest to nie tylko dokładny przypadek użycia, ale prawidłowe rozwiązanie.
Ze względu na strukturę mojego skryptu odpowiedź nie pasowała dosłownie, to jest teraz skrypt;
Serwer kontynuuje wysyłanie danych do pliku dziennika po I ctrl+ cin
less
.Dziękuję za poświęcony czas.
źródło
Czy próbowałeś zaprzeczać ?
lub cokolwiek twoja praca; disown jest wbudowaną powłoką, jego strona podręcznika stwierdza:
EDYTOWAĆ
Zabawne, twoja konstrukcja działa na moim Arch Linux:
Przed ps polecenia, musiałem przewijać plik out.log, potem Ctrl+C, potem q.
źródło
nohup
linię w funkcji, któradisowns
sama w sobie, ale powinna być taka sama jaknohup
. Nie sądzę, żeby to byłSIGHUP
problem, ponieważ kiedy usuwamless
wiersz, skrypt kończy się, a serwer nadal działa