Sprawdź polecenie disown

10

Wydałem ^z; bg; disownsekwencję, aby umożliwić mi zamknięcie sesji ssh, w której prowadzę bardzo ważny, długotrwały proces. Ten proces zapisuje dane wyjściowe statusu do stderr i kontynuuje to nawet po odłączeniu (potwierdzone przez lsof, stderr fd jest otwarty na r / w).

Czy istnieje sposób na ustalenie, czy proces rzeczywiście został odrzucony (nie odzyska ODCZYTU, jeśli powłoka go odzyska)?

mikewaters
źródło
1
Zastanawiam się, czy to musi przejść do unix.stackexchange.com
Rilindo
2
Ciekawe, dlaczego nie: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Odpowiedzi:

12

W Bash disownwydane przez siebie polecenie usunie procesy działające w tle (przez bglub &) z aktywnej tabeli zadań i oznaczy je, aby nie otrzymywały POWIĘKSZENIA po wylogowaniu.

Możesz także przekazać jedno lub więcej zadań do odrzucenia, np disown 1 3. disown -hFlaga jest przydatna, jeśli chcesz zachować miejsca pracy w tabeli, ale nadal nie SIGHUP na wylogowania.

Możesz wyświetlić tabelę zadań, wydając jobspolecenie. Po udanym tle pojawi się [1]+ command &. Po odrzuceniu zadania nie powinno ono być wyświetlane w tabeli zadań i nie powinno być zabijane podczas wylogowywania. Nadal można zobaczyć proces za pomocą ps ux, toporaz innych narzędzi procesowych oglądania.

Po odrzuceniu zadania możesz poczekać na jego naturalne zakończenie lub wysłać sygnał killdo PID, aby go zatrzymać.

Ponieważ Bash po prostu usuwa zadanie z listy uruchomionych zadań do zakończenia, a uchwyty plików na stdout terminala i stderr są nadal otwarte, będziesz otrzymywać dane wyjściowe z zadania do momentu zamknięcia urządzenia terminala (po wylogowaniu) .

Przykłady:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Zwykle używam tylko disownjeśli uruchomić polecenie potencjalnie długo działa jak rsynclub cpa potem zdecydować, muszę się wylogować bez zakończenia go. Jeśli wiesz, że zamierzasz uruchomić polecenie i wylogować się, możesz przechwycić dane wyjściowe, przesyłając je strumieniowo lub teewrzucając do pliku, uruchamiając je nohuplub uruchamiając screen(co pozwala ci odzyskać własność polecenia / zakończyć później ).

Przykłady:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null
lunixbochs
źródło
1
+1 pouczające i z przykładami. Miły!
Andy Smith,
Bardzo pouczający komentarz; czy mówisz, że nie można zweryfikować oderwania procesu (poza tym, że nie ma go już w tabeli zadań)?
mikewaters
1
kiedy uruchomisz detachzadanie w tle, zostanie ono odłączone :) Naprawdę nie ma tam środka, gdzie uruchomienie go w procesie w tle nic nie da. sprawdzanie sprawdza jobstylko, czy nie próbowałeś odłączyć zatrzymanego procesu lub czegoś takiego.
lunixbochs,