Jak mogę przenieść proces w tło, a także wyciszyć jego wynik?

11

Powiedzmy, że uruchamiam proces w terminalu, który wysyła dane wyjściowe do standardowego błędu podczas działania. Chcę przenieść proces w tło i jednocześnie go uciszyć.

Czy istnieje sposób, aby to zrobić bez zatrzymywania procesu i ponownego uruchamiania go przy użyciu &i > /dev/null 2>&1? Zastanawiam się, czy jest jakieś polecenie, które wykonuje bg i może zmienić deskryptory wyjściowe procesu docelowego.

dan
źródło

Odpowiedzi:

9

Za późno. Po uruchomieniu procesu powłoka nie ma już kontroli nad deskryptorami plików procesu , więc nie można go wyciszyć za pomocą polecenia powłoki.

Można jedynie próbować zabićSIGHUP do procesu. Jeśli twój proces obsługuje to poprawnie , powinien odłączyć się od kontrolowania tty . Niestety, wiele programów nie radzi sobie z tym poprawnie i po prostu umiera.

andcoz
źródło
nie możesz zrobić CTRL + Z, aby umieścić proces w tle? nie wycisza procesu, a jeśli się wylogujesz, myślę, że to także zabija proces.
Roy Rico
1
@RoyRico, zabijającSIGSTOP do procesu (lub jak mówisz robi Ctrl + Z ) nie uciszyć proces. Zatrzymuje proces!
andcoz
5

Proces uruchamiany z terminala ma swoje stdin, stdout i stderr związane z terminalem i nie możesz nic na to poradzić bez odzyskania kontroli nad tym terminalem ... Normalnie. Ale są pewne podstępne narzędzia, które pozwalają ci to zrobić. Spójrz na ten przykład . I inne programy jak rettywspomniano tam.

rozcietrzewiacz
źródło
3

Nie zgadzam się z andcoz, że jest już za późno, aby uciszyć wyjście.

Zakładając, że proces działa na pierwszym planie, użyj go, Ctrl-Zaby zawiesić proces. Spowoduje to zgłoszenie numeru zadania i identyfikatora procesu. Możesz przejść dalej i przenieść proces na drugi plan, używając bg %1(dla zadania nr 1). Mimo że przenosi to proces na tło, nie wycisza danych wyjściowych. Aby wyciszyć dane wyjściowe, można użyć gdbdo przekierowania wszystkich danych wyjściowych /dev/null.

Zostało to bardzo dobrze opisane wcześniej na /programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-lin/593764#593764 .

Mike Covington
źródło
0

Jeszcze innym narzędziem wiersza polecenia jest detach. Najnowsza wersja obsługuje pisanie plików pid, używanie plików dla stdin, stdout i stderr oraz uruchamianie na pierwszym planie. (Strona internetowa detachomawia również podobne narzędzia.)

http://inglorion.net/software/detach/

Paweł
źródło