Koddan Çalıştır (GNU) Ekranı


11

Bazı uygulamayı ekran oturumu içinde ama bir komut dosyasından başlatmak istiyorum.
Komut dosyası olmadan, sadece ekranı başlatır, sonra crtl-ac ile N pencerelerini açar ve her pencerede programları çalıştırırdım.

Aşağıdakileri denedim

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

Ama taktığımda oturum kuyruğu çalışmıyor. Oturumu hemen sonra screen -d -m -S startupekler screen -S startup -X exec tail -f /var/log/messagesve başka bir terminalden çalıştırırsam çalışır.

Bir şey mi kaçırdım ?

Düzenleme AlexD cevap sonrası:

Yarım çalışma çözümü

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

Yürütme sırasında komutla ekran komutunu (-X'den sonraki) zincirleme çalışıyor olabilir çünkü muhtemelen ekran ayrıldığında geçerli bir pencere olmadığında exec geçerli bir pencerenin tanımlanmasını bekler. Bu ipuçları için AlexD'ye teşekkürler .

Ancak garip bir yan etkisi var: program durduğunda (ekran oturumunu eklerseniz ve kuyruğu crtl-c yaparsanız veya kuyruğu öldürürseniz) ekran penceresi kapanır.
Bu nedenle, davranış Crtl-A c ile aynı değildir ve komutu çalıştırın
Başka bir yan etki de 2 komutu zincirleyememenizdir.


screen Her zaman o aracın normal bir özelliktir :) çalıştırmak ..Bu yüzden eğer - komut biter başlatıldı zaman sona erer screen top, çıktığınızda top, screençok çıkılacak
warren

Evet şimdi, bu yüzden ekran deamon olarak başlatmayı denedim sonra exec kullanın sonra yeni bir pencere açmak için ekran komutunu kullanın (bir kabuk lauching). Ben de exec ve kuyruk arasında ya da ekran ve tu arasında tu prepend bash denedim ama ikisi de çalışıyor
yarıçapı

Yanıtlar:


14

screen -S test -X screen commandKomut sen ama sen vermek nedenlerle, senin cini oturumuna pencere eklemek gerekir budur. Çünkü -X bir kabuk komutu değil bir ekran komutu alır ve bir pencere oluşturmak için ekran komutu kafa karıştırıcı bir şekilde ekran olarak adlandırılır. Yürütme ekranı komutu yok. Komut dosyanızı kabuk komut dosyası (örneğin:) kullanarak oluşturmazsanız zincirleme de yoktur screen -S script -X screen sh -c 'command1; command2;'.

screen -S test -X screenKomut olmadan çağrı yapmak işe yaramaz çünkü varsayılan komut bir kabuktur ve bir kabuk oluşturduktan sonra, bu kabuk içinde komutları çalıştırmak için etkileşimli olmayan (ve sapkın olmayan) bir yolunuz yoktur. Komutu etkileşimli bir kabuk olmadan kendi başına çalıştırmak daha iyidir. Yan etkisi, komuttan çıkıldığında ekran penceresinin artık bir alt öğesi olmaması ve kapanmasıdır.

Şimdi, komuttan çıktıktan sonra ekranın pencereyi zaten açık tutmasını isteyebilirsiniz. zombieBunu etkinleştirmek için ekran komutunu kullanın . Sıralamanız şöyle görünür:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

Etkileşimli olarak yeniden bağlamak için:

screen -S script -r

Son olarak, bu -X komutlarını bir screenrc betiği olarak yeniden yazabilirsiniz.

Screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

Senaryo:

screen -d -m -S script -c screenrc

Evet -X'in bir ekran komutu aldığını biliyorum, "Zincirleme ekran komutu (-X'den sonra)" dediğimde kastettiğim (Tamam, hiç net değil) ama bir ekran yürütme komutu var, adama bak ancak söylediğiniz gibi etkileşimli olmayan modda istendiği gibi çalışmasını sağlamanın bir yolu yoktur. Neyse AlexD çözümü ve zombi komutu ile eklemek istediğimi aldım! Thank you
yarıçap

@ Tobu: Zombilerden bahsettiği için +200! Nihayetinde bu korkunç kılavuzda hiç fark etmemiştim!
vines

6

Aynı etkiyi Ctrl-A cistiyorsanız, screenbunun yerine şunları kullanmalısınız exec:

ekran -S testi -X ekran kuyruğu -f / var / log / messages
ekran -S testi -X ekran
ekran -S testi -X ekran kuyruğu -f /var/log/xinetd.log

Ayrıca, komutlarınızı yukarıdaki $HOME/.screenrc-younameitdosyaya ( screen -S test -Xönek olmadan ) taşıyabilir ve screen -c $HOME/.screenrc-younameitbelirli bir ekran oturumu oluşturmak istediğinizde başlatabilirsiniz .


Ctrl-A c benim 3. satırda, sanırım exec çalışmıyor çünkü ekran ayrıldığında tanımlanamayabilir geçerli pencerelerde komut çalıştırmak. Geçici çözüm zincirleme ekran ve komut güzel, ben denemeliydim! Kendime bir cevap ekleyeceğim, çünkü cevabınız oturumun oluşturulmasından yoksun ve işe yaramaz bir çizgiye sahip (2. bir, 1 pencereyi atlıyor)
yarıçap

Aslında beklendiği gibi çalışmıyor, program durur durmaz pencereler kapanıyor. Eğer ekran -S testi -X ekran ls yaparsanız, pencere kapanacak ve asla sonucu görmeyeceksiniz
yarıçap

1

byobu bir seçenek kullanıyor mu?


Ben sadece denedim, nasıl yardımcı olabilir görmüyorum ama byobu ile çalışan bir çözüm varsa Tamam olabilir, ben sadece bir ekran sadece çözüm tercih ama bir eklenti kullanmak hiçbir çözüm sahip olmaktan daha iyidir!
yarıçap

1

Bu gece aynı şeyi yapıyordum, önceden açılmış birkaç dosyayla ekranı açmak istedim. Bunların hepsini çözmem biraz zaman aldı ama nihayet oldukça iyi çalışan aşağıdaki gibi ortaya çıktım:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

Bu, altı farklı ekran oluşturacak ve 1-5 arasındaki ekranlar çeşitli dosyaları açacaktır. Tüm özellikleri bilmiyorum ama 'şeyler' aslında ekrana aşağıdaki alıntı metin bir ekran komutu değildir söyler. Daha sonra 'eval' alıntılarda yer alan her şeyi değerlendirir. Bu olmadan screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" , alıntılanan metni yürütmeden basitçe yönlendirir. Eval '\ 015' i yeni satır olarak okuyacak ve böylece önceki metni yürütecaktır.

Diğer ayrıntılar açısından screen -p 1 -S CS140 -X CMD kabuğa, 'CMD' yi ekran oturumunun 'CS140' adlı ilk penceresine göndermesini söyler.

Umarım yardımcı olur!

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.