Ctrl + cw procesie podrzędnym zabija wcześniejszy proces w skrypcie

15

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 followtego 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 lesspolecenia (aby zatrzymać tailing) to w jakiś sposób zabija serwer rozpoczęty nohupna 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 ^Cw less(A końcowy Received ^C signal, shutting downjest 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 ^Gdo zastąpienia polecenia przerwania, ale ctrl+ gi tak zrobił dokładnie to, co ^Crobił (więc może to być problem z moim emulatorem terminala; konsole)

  • umieszczanie linii nohupi / lub lesswiersza w nawiasach (aby była to podpowłoka)

  • uruchamianie skryptu xtermzamiastkonsole

Hashbrown
źródło
Ktoś mógł natknąć się na mój problem; 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ć?
Hashbrown
3
nohupzapobiega odbiorze SIGHUPsygnału przez proces , podczas gdy CTRL + C wysyła SIGINTsygnał. Dlatego nohupnie ma oczekiwanego efektu.
Piotr Dobrogost

Odpowiedzi:

11

Miałem rację, myśląc, że był SIGINTwysyłany do wszystkich procesów, gdy ctrl+ c, ale głupio pomyślałem, że wykonanie innego procesu wyprowadziłoby go poza process group(patrz moje próby w P.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;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

Serwer kontynuuje wysyłanie danych do pliku dziennika po I ctrl+ cin less.

Dziękuję za poświęcony czas.

Hashbrown
źródło
0

Czy próbowałeś zaprzeczać ?

  disown -h %1

lub cokolwiek twoja praca; disown jest wbudowaną powłoką, jego strona podręcznika stwierdza:

zapierać się

disown [-ar] [-h] [jobspec ...]

Bez opcji każdy rodzaj zadania jest usuwany z tabeli aktywnych zadań. Jeśli opcja -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a „nor -r' option is supplied, the current job is used. If no jobspec is supplied, the-a” oznacza usunięcie lub zaznaczenie wszystkich zadań; opcja `-r 'bez argumentu spec zadania ogranicza operację do uruchamiania zadań.

EDYTOWAĆ

Zabawne, twoja konstrukcja działa na moim Arch Linux:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Przed ps polecenia, musiałem przewijać plik out.log, potem Ctrl+C, potem q.

MariusMatutiae
źródło
tak, ale nie wiem jak go zastosować. Próbowałem umieścić nohuplinię w funkcji, która disownssama w sobie, ale powinna być taka sama jak nohup. Nie sądzę, żeby to był SIGHUPproblem, ponieważ kiedy usuwam lesswiersz, skrypt kończy się, a serwer nadal działa
Hashbrown
@Hashbrown pls zobacz moją edycję
MariusMatutiae
Tak, zrobiłem również test, wywołując prosty skrypt bash zamiast pliku wykonywalnego {SERVER}. Nohup po prostu działał dobrze. Zobacz mój komentarz do pytania. Myślę, że w jakiś sposób celowo nasłuchuje. Ponieważ jest to odpowiedni serwer (i mało znany), nie mogę nawet powiedzieć, co to jest, aby ktoś mógł powiedzieć „och, robi X, musisz zrobić Y”
Hashbrown