`<& -` ne yapar?


20

Bash snippet'ini uzaktan yürütülen bir ssh komutunun arka planına kopyaladım:

ssh user@remote <<CMD
some process <&- >log 2>error &
CMD

Ne yapar <&-?
Benim tahminim bunun aynı olduğu< /dev/null

Bir sonraki anlayış üç ana dosya tanımlayıcıları (yani stdin, stdout, stderr) engellemek için kapalı olması gerekir:

  1. İş arka plan ve komut dosyası çıkıyor - bir şekilde çakışıyor mu?
  2. Terminal kapatıldığında, terminalden stdin kabul eden tüm işlemler kapatılır mı?

Zorunlu çapraz referans: Bkz . Kabuğun kontrol ve yönlendirme operatörleri nelerdir? - bu operatör hakkında söylediği tek şey "dosya tanımlayıcıları kapatmak veya çoğaltmak için kullanılabilir" ve "kabuğunuzun kılavuzunun ilgili bölümüne bakın".
G-Man, 'Monica'yı Eski

Doğru hatırlarsam, ssh -nNT user@remote 'command'etkileşimli olmayan bir SSH oturumu oluşturur. Ekleme &arka kendisine, sona ekleme için nohupiçin commandbağlantı ölmesi çalışmasını sağlamak için.
Mark K Cowan

1
@MarkKCowan man ssh, -N'nin uzak komut çalıştırmayı tamamen devre dışı bıraktığını ve hızlı bir testin bunu desteklediğini önerir.
Tom Hunt

Ah evet, ters port yönlendirme için -nNTR kullandım. -N ve -R'yi görmezden gelin :)
Mark K Cowan

Yanıtlar:


30

<&-ile tam olarak aynı şey değildir < /dev/null. <&-fd 0'ı kapatırken < /dev/null, cihazı /dev/nullhiçbir zaman veri sağlamayan ve her zaman okuma sırasında EOF veren cihazdan yönlendirir . Aradaki fark çoğunlukla read(2)kapalı bir FD'den ( <&-vaka) gelen bir çağrı EBADF ile hata verirken, boş yönlendirilmiş bir FD'den yapılan bir çağrı bayt okunmaz (dosya sonu koşulu) döndürür. Programınız stdin'den hiç okumuyorsa, ayrım önemli değildir.

Bir şeyi arka planlıyorsanız FD'leri kapatmak iyi bir uygulamadır, çünkü TTY'den bir şey okumaya çalışırsa arka planlı bir süreç askıda kalır. Bu örnek, olması gereken her şeyi tam olarak işlemez; ideal olarak , arka plan sürecini tamamen birbirinden ayırmak için bir yerde bir nohupya da setsidçağırma olurdu .


Bu yüzden nohupdosya tanımlayıcılarını kapatmaya ek olarak kullanmalıyım ?
Eric Francis

2
En kapsamlı yöntem (programların kendilerini cömertleştirme yöntemini taklit eden) benzer bir şeydir setsid some process <&- >path/to/log 2>path/to/error. Daha hızlı yöntem şuna benzer nohup some process &.
Tom Hunt

2
@EricFrancis: nohupBurada bir anlam ifade etmiyor. kontrol terminali kapalıyken nohupişlemin HUPsinyal almasını önleyin . Ama bu durumda terminaliniz yoktu.
cuonglm

@TomHunt: Arka plan işlemi askıda kalmadı, ssh oturumu başladı.
cuonglm

2
fds 0, 1 & 2'yi kapatmak için iyi bir fikir değil ... sonraki fd'nin bu değerlerden birini almasını istemezsiniz.
Murray

7

Bakınız man bash:

  [n]<&word

girdi dosyası tanımlayıcılarını çoğaltmak için kullanılır. Bir wordveya daha fazla rakama genişlerse, ile belirtilen dosya tanımlayıcı n, o dosya tanımlayıcının bir kopyası olarak yapılır. İçindeki rakamlar word giriş için açık bir dosya tanımlayıcı belirtmezse, bir yönlendirme hatası oluşur. Sözcük olarak değerlendirilirse -, dosya tanımlayıcı nkapatılır. Eğer nbelirtilmemişse, standart girdi (dosya tanıtıcı 0) kullanılır.


Doğru tanım, sahip olduğunuzda ne olacağı belirtilmemiştir [n]<&wordve kelime tek bir rakamdan fazlasını içeriyorsa.
schily

Ne demek istiyorsun? Mı man bashyanlış?
Eric Francis

@EricFrancis, standartta belirtilmediğinden, bashaklı başında bir şekilde uygulamayı seçer ("aklı başında" bazı uygun tanımlamalar için). Diğer mermiler olabilir veya olmayabilir.
muru

@muru Soru etiketlendi bash, değil posix-shell.
Barmar

@Barmar tamam. Yani...?
muru

7

<&- standart girişi kapat.

POSIX'deki tarafından belirlenen genel bir şekilde, olduğu:

[n]<&word

Dosya tanımlayıcı yapmak amacı n, dosya tanımlayıcı tarafından belirtilen bir kopyasıdır word. Eğer Standart içinde varsayılır natlanırsa, ve eğer wordolduğunu -, dosya tanıtıcı nkapalı olacaktır.

Bu aynı değil </dev/nulldurumunda ne zamandan beri, </dev/nullstandart girdi hala açıldı ve başka bir yere yönlendirildi.

Ssh soketine bağlı işlemlerin tüm dosya tanımlayıcılarını kapatmanız gerekir, aksi takdirde ssh oturumu kapanamaz.

Ekranı veya tmux kullanarak komutu ssh oturumuna eklemeden uzak makinede çalıştırabilirsiniz :

ssh user@remote 'screen -S test -d -m command'

Neden aşağı oy?
cuonglm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.