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


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.