Po zdalnym nohup z tcsh

11

Mam instancję tcsh w xterm, która uruchamia proces długoterminowy (tygodnie?). Serwer Xvnc, pod którym działa, wyszedł z chwastów; zużywa 100% procesora i nie odpowiada. (To znany błąd i wiem, że nie można go naprawić).

Proces długoterminowy jest obecnie blokowany na standardowym wyjściu.

Czy jest jakiś sposób, aby zabić podstawowy proces - tcsh, xterm, cokolwiek - i utrzymać ten długoterminowy proces?

(Proszę, nie ma odpowiedzi screen. Wiem. To nie jest mój proces; to użytkownik. Nie nauczą się.)

wfaulk
źródło

Odpowiedzi:

17

Ten post może pomóc. Zalecane jest:

  1. proces w tle (z Ctrl-Z, a następnie bg )
  2. uruchom disown -h% [jobid] (prawdopodobnie bash-ism, więc będziesz musiał tłumaczyć dla tcsh)

Złe wieści , oczywiście, jest to, że BG musiałyby być wykonane w tej samej powłoce proces jest uruchomiony w ... ale ... może to już są umieszczane w tle.

Naprawdę złą wiadomością jest to, że wyprze wezwanie może muszą być wykonane w tej samej powłoki. W takim przypadku tak, jesteś pieprzony. Ale nie jestem pewien, może root może to wymusić.

Hmm Możliwe dobre wiadomości - tcsh automatycznie wyłącza :

Jeśli program tcsh zakończy działanie w sposób nienormalny, automatycznie wyłącza zadania uruchomione w tle po jego zakończeniu.

Więc jeśli twój długoterminowy proces jest już w tle, zabicie jego rodzica tcsh powinno pozwolić mu kontynuować. Proces jest teraz odłączony od terminalu początkowego. (Jeśli nie, zobacz „złe wieści” powyżej.)

Niestety nie jest to ekran, więc nie ma prawdziwego ponownego połączenia. Możesz go sfałszować za pomocą gdb (ponownie, z pierwszego linku):

[...] przy niektórych brudnych włamaniach ponowne otwarcie procesu „stdout / stderr / stdin” nie jest niemożliwe.

Więc nadal możesz utworzyć puste okno (na przykład, które uruchamia tryb uśpienia).

A następnie użyj na przykład gdb, aby dołączyć do procesu, wykonaj połączenie call close (0)
call close (1)
call close (2)
call open ("/ dev / pts / xx", ...)
call dup (0)
zadzwoń dup (0)
odłącz

Dane wyjściowe procesu przejdą na ekran. Nie byłby podłączony do tego terminalu ekranowego, więc na przykład [sic] zabiłby polecenie „uśpienia”, a nie proces, ale to może wystarczyć dla OP.

Zastanawiam się, czy w tym procesie nie powinno być również „call dup (1)” i „call dup (2)” ...

quack quixote
źródło
Tak, to proces na pierwszym planie, więc myślę, że jestem zepsuty.
wfaulk
Tak. ale jak powiedziałeś, to nie twój proces, nie twoja wina. przepraszam, że utknąłeś w bałaganie, tho.
quack quixote
2
To całkowicie uratowało mi tyłek. Zetknąłem się z tym samym problemem, o którym pisałem na początku, a mianowicie, że proces blokował się na STDOUT, kiedy serwer X (i, jak sądzę, xterm pomiędzy) zaklinował się. Okazuje się, że tak naprawdę nie musiałem nic robić oprócz bliskiego STDOUT. Ten wynik był nieistotny; prawdziwe dane są gdzieś w pliku dziennika. Byłem więc w stanie podłączyć się za pomocą gdb, uruchomić „call close (1)”, a następnie „cont” i znów się porusza. Dzięki wielkie!
wfaulk
tak! ciekawy. które wszystko odmroziło? niesamowitość. Cieszę się, że to pomogło!
quack quixote
2
Warto zauważyć, że wysyłanie „Ctrl-Z” do procesu pierwszego planu i wysyłanie SIGSTOP do jego pid są tym samym. (SIGCONT rozpoczyna proces od nowa.) Nie wiem, czy byłoby to pomocne dla innych w tej samej sytuacji, czy nie, ale podczas moich szybkich testów wysyłam SIGSTOP, a następnie SIGCONT duplikuje „Ctrl-Z”, a następnie bg.
wfaulk