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
nohup
zapobiega odbiorze SIGHUP
sygnału przez proces , podczas gdy CTRL + C wysyła SIGINT
sygnał. Dlatego nohup
nie ma oczekiwanego efektu.
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ć?