Skopiowałem fragment Basha do tła polecenia ssh wykonanego zdalnie:
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
Co ma <&-
zrobić?
Domyślam się, że to to samo co< /dev/null
Mój następny zrozumienie jest, że trzy główne deskryptory plików ( stdin
, stdout
, stderr
) muszą być zamknięte, aby zapobiec:
- Zadanie jest w tle, a skrypt kończy się - jakoś sprzeczny?
- Kiedy terminal się zamyka, wszystkie procesy akceptujące standardowe wejście z terminala są zamykane?
bash
shell
io-redirection
Eric Francis
źródło
źródło
ssh -nNT user@remote 'command'
utworzę nieinteraktywną sesję SSH. Dołącz&
do tła, dołącznohup
do,command
aby utrzymać działanie, jeśli połączenie zostanie przerwane.man ssh
sugeruje, że -N wyłącza całkowicie uruchomienie komendy zdalnej, a szybki test to obsługuje.Odpowiedzi:
<&-
nie jest całkiem tak samo jak< /dev/null
.<&-
zamyka fd 0, natomiast< /dev/null
przekierowuje je z urządzenia/dev/null
, które nigdy nie dostarcza żadnych danych i zawsze podaje EOF podczas odczytu. Różnica polega głównie na tym, żeread(2)
wywołanie z zamkniętego FD (<&-
przypadek) spowoduje błąd w EBADF, podczas gdy wywołanie z przekierowanego na zero FD nie zwróci odczytanych bajtów (warunek końca pliku). Jeśli twój program nigdy nie czyta ze standardowego wejścia, rozróżnienie nie ma znaczenia.Zamykanie FD jest dobrą praktyką, jeśli tworzysz coś w tle, ponieważ proces w tle zawiesi się, jeśli spróbuje odczytać cokolwiek z TTY. Ten przykład nie obsługuje jednak wszystkiego, co powinien; idealnie byłoby gdzieś
nohup
lubsetsid
inwokacja, aby całkowicie oddzielić proces tła.źródło
nohup
oprócz zamykania deskryptorów plików?setsid some process <&- >path/to/log 2>path/to/error
. Szybsza metoda jest podobnanohup some process &
.nohup
nie ma tutaj sensu.nohup
uniemożliwić procesowi odbieranieHUP
sygnału, gdy jego terminal kontrolny jest zamknięty. Ale w tym przypadku nie miałeś żadnego terminalu.Zobacz
man bash
:źródło
[n]<&word
a słowo zawiera więcej niż jedną cyfrę.man bash
nieprawda?bash
decyduje się na wdrożenie go w rozsądny sposób (dla pewnej odpowiedniej definicji „rozsądny”). Inne powłoki mogą, ale nie muszą.bash
, nieposix-shell
.<&-
zamknij standardowe wejście.Ogólny kształt, określony przez POSIX jest:
Jego celem
n
jest utworzenie deskryptora pliku to kopia deskryptora pliku oznaczona przezword
. Standardowo przyjmuje się, jeślin
zostanie pominięte, a jeśliword
tak-
, to deskryptor plikun
zostanie zamknięty.To nie to samo, co
</dev/null
w przypadku</dev/null
gdy standardowe wejście wciąż się otwierało i zostało przekierowane w inne miejsce.Musisz zamknąć wszystkie deskryptory plików procesów dołączonych do gniazda ssh, w przeciwnym razie sesja ssh nie będzie mogła zostać zamknięta.
Możesz uruchomić polecenie na zdalnym komputerze bez dołączania go do sesji ssh, używając screen lub tmux :
źródło