Kontrol terminali ile bağlantısı kesilmiş bir komut / komut dosyası çağırılsın mı?


9

Normalde otomatik bir işlem (örneğin cron, Jenkins) olarak çalıştırılan bir komut dosyasının davranışını araştırıyorum. Komut dosyası (sonunda) etkileşimli olarak çalıştırıldığında farklı davranan (kullanıcı girdisi arayan) komutları çağırabilir; Örneğin, patchtersine çevrilmiş bir yama ile ne svnyapacağını soracak ve şifreleri isteyecek, ancak etkileşimli olmayan bir şekilde çalıştırıldıklarında ne olacağını görmem gerekiyor.

patchEtkileşimli olmadığını ikna etmek oldukça kolaydır; Sadece stdoutbir tty olmayan yönlendirmek gerekir :

$ </dev/null > >(cat) /path/to/myscript --args

Ancak svn, varsa kontrol terminaline bağlanır; senaryoları geçmek --non-interactiveiçin düzenlemek gerçekten bir seçenek değil, çünkü bu birkaç seviye derinlikten geliyor ve her çağrıyı bulduğumdan emin olmak zor olurdu.

Bir komut dosyasını / komutu etkileşimli olmayan bir şekilde, denetleyen bir terminal olmadan çağırmanın bir yolu var mıdır (bu yüzden /dev/ttymevcut değildir)? Stdout / stderr'ın hala terminalime gitmesini tercih ederim.

( Komut dosyasını etkileşimli olmayan bir kabukta çalıştır sorusunu buldum ? Ancak cron ve kullanıcı ortamı arasındaki farkları tartışan cevaplar; Etkileşimsizlik dışındaki tüm farklılıkları zaten ortadan kaldırdım.)

Yanıtlar:


13

Bir terminale bağlı olmayan başka bir oturum başlatmanız gerekir, örneğin:

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test

Ayrıca start-stop-daemonbazı Linux dağıtımlarında bulunan komuta da bakınız . Bir de daemonkomut var.


Bu çıktı ne anlama geliyor? Çok şifreli görünüyor.
anatoly techtonik

2
@anatolytechtonik önemli parçaları "tty değil" olan ttystdin üzerinde hiçbir terminal olduğunu teyit çıktı ve "?" arasında TTY sütununda psteyit çıkış orada hiçbir kontrol Tty için shişlem (ve bir şey altında çalışan).
mr.spuratic

Komutu diğer komutlar gibi çalıştırmak için tuşunu kullanın setsid -w. Örnek: setsid -w sh -c 'tty < /dev/tty'verir sh: 1: cannot open /dev/tty: No such device or address(Not: /dev/ttysizin kontrol ettiğiniz tty'dir). -wSetid olmadan işlemi paralel / arka planda çalıştırır.
Tino

0

Muhtemelen bir beklenti senaryosu yapmak isteyeceksiniz. SVN ile örnek:

/programming/609445/using-expect-to-login-into-svn


Bu işe yaramıyor; wait komutları etkileşimli olarak çalıştırır.
Mart'ta ecatmur

Etkileşimli olarak ne anlamda? Kullanıcıdan girdi gerektirmesi açısından? Demek istediğin buysa, bu durumda mevcut olan pek bir şey beklenemezdi. Bunun için kullandığım bir örnek Solaris üzerinde passwd komutunun bir --stdin seçeneği yok, bu yüzden bir hesap için rasgele bir parola beslemek için passwd'yi saran bir bekletme komut dosyası yürüten bir cronjob kurulumum var. İnsan etkileşimi gerekmez. Bunun kullanıcının gereksinimi olduğunu anlıyorum. Yine de yanlış anlayabilirdim.
Mart'ta Bratchley

Aslında bunu ne kadar çok okursam, ne istediğini yanlış anladığımı fark ettim. Özür.
Mart'ta Bratchley

0

Bazen stdin'i açık tutmanız gerekir (stdin'den eof almayın) (örn. Bekliyoruz). Bu durumda / dev / null değerini / dev / zero olarak değiştirin.

setsid sh -c 'make test' </dev/zero >log 2>&1
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.