Saya menyalin cuplikan Bash ke latar belakang perintah ssh yang dijalankan dari jarak jauh:
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
Apa yang <&-
harus dilakukan
Dugaan saya adalah bahwa itu sama dengan< /dev/null
Pemahaman saya berikutnya adalah bahwa tiga deskriptor file utama ( stdin
, stdout
, stderr
) perlu ditutup untuk mencegah:
- Pekerjaan yang dilatar belakangi dan skrip yang keluar - entah bagaimana bertentangan?
- Ketika terminal ditutup, semua proses yang menerima stdin dari terminal ditutup?
bash
shell
io-redirection
Eric Francis
sumber
sumber
ssh -nNT user@remote 'command'
akan membuat sesi SSH non-interaktif. Tambahkan&
ke latar belakang, tambahkannohup
kecommand
agar tetap berjalan jika koneksi Anda mati.man ssh
menyarankan bahwa -N menonaktifkan menjalankan perintah jarak jauh sepenuhnya, dan tes cepat mendukungnya.Jawaban:
<&-
tidak persis sama dengan< /dev/null
.<&-
menutup fd 0, sedangkan< /dev/null
mengalihkannya dari perangkat/dev/null
, yang tidak pernah memberikan data apa pun dan selalu memberikan EOF saat dibaca. Perbedaannya adalah sebagian besar bahwaread(2)
panggilan dari FD tertutup (<&-
kasing) akan kesalahan dengan EBADF, sedangkan panggilan dari FD redirect yang diarahkan tidak akan menghasilkan pembacaan byte (kondisi akhir file). Jika program Anda tidak pernah membaca dari stdin, perbedaannya tidak masalah.Menutup FD adalah praktik yang baik jika Anda melatar belakangi sesuatu, karena proses latar belakang akan hang jika mencoba membaca apa pun dari TTY. Contoh ini tidak sepenuhnya menangani semua yang seharusnya; idealnya akan ada
nohup
atausetsid
doa di suatu tempat, untuk sepenuhnya melepaskan proses latar belakang.sumber
nohup
selain untuk menutup file deskriptor?setsid some process <&- >path/to/log 2>path/to/error
. Metode yang lebih cepat adalah sesuatu sepertinohup some process &
.nohup
tidak masuk akal di sini.nohup
mencegah proses menerimaHUP
sinyal ketika terminal kontrolnya ditutup. Tetapi Anda tidak memiliki terminal dalam hal ini.Lihat
man bash
:sumber
[n]<&word
dan kata mengandung lebih dari satu digit.man bash
salah?bash
memilih untuk mengimplementasikannya dengan cara yang waras (untuk beberapa definisi "waras" yang sesuai). Kerang lain mungkin atau mungkin tidak melakukannya.bash
, bukanposix-shell
.<&-
tutup input standar.Bentuk umum, yang didefinisikan oleh POSIX , adalah:
Tujuannya untuk membuat file deskriptor
n
adalah salinan deskriptor file yang ditandai olehword
. Standar diasumsikan jikan
dihilangkan, dan jikaword
ini-
, file descriptorn
akan ditutup.Ini tidak sama dengan
</dev/null
, karena ketika dalam kasus</dev/null
, input standar masih terbuka, dan dialihkan ke tempat lain.Anda perlu menutup semua file deskriptor proses yang dilampirkan ke soket ssh, jika tidak, sesi ssh tidak dapat ditutup.
Anda dapat menjalankan perintah pada mesin jarak jauh tanpa melampirkannya ke sesi ssh, dengan menggunakan layar atau tmux :
sumber