Eklemeden ekran oluşturun ve komutu çalıştırın


28

Bir ekran oturumunda çalışan bir komut dosyasını başlatmayı ve durdurmayı içeren bir bakım rutinini otomatikleştirmeye çalışıyorum. Benim yaklaşımım, ekran oturumunu sonlandırmak ve ardından onu yeniden başlatmak ve ekrana eklemek zorunda kalmadan bir ekran oluşturmak ve bir komutu geçmek için yetenekleri kullanarak bir komut dosyasından komutu çalıştırmak.

Ancak bu konuda zorluk yaşıyorum. Ekranı kullanarak bağlamadan doğru bir şekilde oluşturabilirim screen -d -m -S screen_name. Ancak, aşağıdakileri temel alan bir komut çalıştırırsam:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

yankı -ne '\ 015' ile tek tırnaklar yerine geri tepmelerle sarılır. Kullandığım komutlar bir dizine ilerlerken ve orada bulunan bir betiği çalıştırırken, kullanıcının enter tuşuna basmasını simüle etmektir. Bu komut çalışır, ancak yalnızca ekran oluşturulduktan sonra bir ekrana eklenmişse. Ekran oluşturma ve içindeki komutları çalıştırma işlemini otomatikleştirmeye çalıştığım için bir betiğin içine eklemek ve ayırmaktan kaçınmak istiyorum. Ekran içinde yürütmek ve sonuçlarıma göre düzenlemek için ihtiyaç duyduğum komutları içeren bir kabuk betiği oluşturma önerisini deneyeceğim.

Bir ekran oluşturup ekran içinde bir komutu bir komutla veya komut oluşturmadan önce ancak komutun yürütülmesinden önce ekrana eklemek zorunda kalmadan çalıştırmanın bir yolu var mı?

Şimdiden teşekkürler.

** Güncelleme - Bir kabuk betiği içinde yürütmem gereken komutları yerleştirme önerisini denedim. Başarılı bir şekilde bir ekran oluşturabildim ve komutları ekran içinden yürütebildim, ancak betiğin çalışmayı durdurduğu zamanki davranışı alıyorum ekran da kapanıyor. Komut dosyası, yalnızca sys yöneticisinin bilgisiyle veya geliştirmeye çalıştığım komut dosyasıyla durması gereken bir günlük komut dosyası olduğundan, bu sorun olmamalıdır, ancak ekran kurulumunun ekranın bu şekilde olması tercih edilir. script durdurulursa kaybolmaz. Bu davranışa ulaşmak mümkün mü? **


1
Aynı problemle karşılaştım ve bu sorunla karşılaşan başkaları için superuser.com'da bir çözüm buldum superuser.com/questions/342463/…
Dan Herbert

Ekranı açık tutmak için aşağıdakileri kullanabilirsiniz: ekran bash -c 'echo "test"; / bin / bash '
gwyn

1
Otomatik kapanma sorununuz için, bitmiş bir pencereyi açık tutabilecek .screenrcçizgiyi içeren bir özel kullanabilirsiniz ve winodw'u kapatmak veya komutu pencerede tekrar çalıştırmak için basabilirsiniz . Benim varsayılan .screenrc için bu var. zombie krkr
Martin C.

Yanıtlar:


17

Bence birkaç konuda sorun yaşıyor olabilirsiniz.

Yeniden takmadan önce komut biterse, ekran kaybolur. Bunu kullanarak demo uygulayabilirsiniz:

screen -d -m ls -l

ls -lKomutu çalıştıracak , ancak screen -listekran işlemi bittiği gibi göstermeyecektir.

Ayrıca, bu \ 015 ile ne yapmaya çalıştığınız hakkında hiçbir fikrim yok. Belki de sorunuzun güncellenmesi yardımcı olacaktır, çünkü yapmaya çalıştığınız şey bir ekran oturumunda birden fazla komut çalıştırmaktır. Bu kadar basit olmalı:

screen -d -m bash -c "command1 ; command2 ; command3"

Bunlar çok kullanılıyorsa, belki sadece bu komutları çalıştıran bir kabuk betiği yapmalısınız, sonra daha basit bir yöntem kullanmalısınız:

screen -d -m /path/to/script.sh

hemen ekran ayrılmadan benzer davranış elde etmek için bir yol var mı? Ssh oturumu başlatmak istediğimi ve ardından hemen ayrılmak istediğimi söyleyin; screen -d -m sshoturum yapılmadan önce parola isteminde ayrılır.
parlak yıldız

Bu benim için çalışmıyor. Hte "commandN" ifadesini uzun süre çalışan birkaç programla değiştirmek, hiçbir şeyin görünmemesine neden olur screen -list. Ayrıca, OP yapmaya çalıştığı gibi bu, ekranı adlandırmaz.
Cerin

Bu yöntemi kullanarak bir python programı çalıştırmak istiyordum. Çalıştırmak için bir sh betiği oluşturmaya çalıştım ancak listede ekranı görmedim. Onun yerine kullandım screen -d -m python EventGenerator.py, hangisi harika çalışıyordu
Dan Ciborowski - MSFT

1
Muhtemelen bunun bash -c "commands"yerine olmalıbash "commands"
marcovtwout

Haklısın, -c olmalı.
Xdg

8

Ayrılmış bir ekran başlat

screen -dmS <screen name>

Daha önce oluşturulan ayrılmış ekranda komutu yürütün

screen -S <screen name> -X stuff '<CMD>\n'

Evet, komutu göndermek için enter sembolünü yazmanız gerekir, aksi takdirde sadece dizgiyi ekrana ekler.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
'malzeme' nedir?
Nadav B

stuffaslında başka bir komutu bir ekran oturumuna kopyalayan bir komuttur: stuff [string] Dize dizesini geçerli pencerenin giriş tamponunda doldurur. Bu "paste" komutuna benzer ancak daha az ek yüke sahiptir. Parametre olmadan, ekranda bir dizginin bir şey yapması istenir. "Stuff" komutuyla büyük tamponları yapıştıramazsınız. Anahtar bağlamaları için en kullanışlıdır. Ayrıca bkz. "Tuş takımı". [ theterminallife.com/sending-commands-into-a-screen-session/ adresinden
alisa

2

Daha önce bu sorunla karşılaştım, cygwin uygulamasında bir hata vardı.

Yaptığım şey sadece aşağıdaki komuta sahip bir ".screenrc_detaching" oluşturmaktı.

#detach
detach 

ve ardından ekranı

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

O zaman ekran oturumunuz var ve zaten ekli ve bağlantısı kesilmiş durumda ve ona komutları basmakta fayda var.

Kolay! : P


2

Bu iş benim için yaptı, işe -cyaramadı

screen -d -m bash -c "command1; command2; command3"


1

Önceki cevapları test etmek için bir copy'n'paste yolu:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Beklenen sonuç şuna benzer olmalıdır:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Bu daha önce ekran oturumu oluşturulmamış demektir)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(Ekran oluşturmak ve ayırmak için harcanan zamandır. Neredeyse anında.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Bu çıkış şov ekranı oturumları kullanılabilir. Son komutta düzenlendi.)

sleep 20; cat /tmp/h

(Bu cat, gnu ekranında yürütülen ana bilgisayar adını gösterir)


ve bu tür testlerin sonucu nedir?
Pierre.Vriens

Haklısın, örnek yoktu. Ekleyeceğim.
Enrique S. Filiage

çok daha iyi! mersi! +1
Pierre.Vriens

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.