Yürütülen komut dosyası bittiğinde GNU ekranının oturumu sonlandırmasını engelleme


34

GNU ekranını, "sanal" bir terminal oluşturmaya zorlamadan, onu eklemeden, içinde komut dosyasını çalıştırmaya ve komut dosyası sona erdiğinde oturumu sonlandırmaya DEĞİLDİR.

Aşağıdakiler dahil birçok kombinasyonu denedim:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

veya

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

ve hiçbiri işe yaramadı. Ben komut dosyası olmadan oturumu alıyorum, komut dosyası çalıştırıyor, ancak işlem tamamlandığında oturum sonlandırılıyor veya "Ekran oturumu bulunamadı" hatası alıyorum.

Temel olarak yapmaya çalıştığım, UDP dinleyicisini çalıştırmak, PHP ile yazılmış ve infinte döngüsünde çalışmasını sağlamak (dinlemeyi kesmeyin). Evet - PHP betiğini &sonunda çalıştırabilir, PHP CLI'yi daemon olarak çalıştırmaya zorlayabilirdim. Sorun şu ki, sunucu (QNAP - asla, asla bu çöplüğü satın almayın!) Adlı bir önemsiz parça kullanıyorum. SSH oturumunu kapattığımda, komut dosyaları durur.

Bu yüzden screentek seçenek gibi görünüyor. Ama anlayamıyorum, neden komut çalıştırıldığında veya komut dosyası bittiğinde oturumu sonlandırıyor?

EDIT : İnternette bulunan bir örneği de denedim:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

Yokluk yok! Taktıktan sonra ( screen -R name) Midnight Komutanının idam edilmediğini görüyorum. Örnek yazar söylemiş olmasına rağmen olacak.


Çağrılma şekliniz, screentek bir komut çalıştırmak için sadece bir pencere oluşturursunuz. Komut çıktığında, pencere kapanır ve screenyapacak hiçbir şeyi kalmaz, bu yüzden çıkar.
jw013

Öyleyse ... iki pencere açmanın (yalnızca komut satırını kullanarak, klavye kombinasyonunu kullanmadan), bir komut dosyasını yürütmenin ve ikincisi screenkapanmasını engellemenin bir yolu var mı? BTW: Fikri hala anlamadım! Eğer screen -dmS nameararsam, yapacak hiçbir şeyi kalmayan, ayrılmış bir pencere yaratırım. Ancak otomatik olarak kapanmaz! Ancak o ayrılmış ekranda bir şey çalıştırmak istediğimde, yürütme işlemi bittiğinde biter. Niye ya? Burada mantık göremiyorum. Pencerenin hiçbir şey yapmamasını sağlayabilirsiniz, fakat pencerenin bir şey yapıp ardından hiçbir şey yapmamasını sağlayamıyor musunuz?
trejder

2
Eğer bir komut belirtmeden bir pencere başlattığınızda, bir değil "hiçbir şey yapmadan". Yaptığı "bir şey", elle çıkana kadar çıkmayan etkileşimli bir kabuk çalıştırıyor.
jw013

Güzel! Bir açıklama için teşekkürler! Öyleyse ... soruya dönün ... ayrık bir ekran / pencerenin içinde bir komut çalıştırmanın ve komutun yürütülmesi sona erdiğinde bu oturumu sonlandırmamanın bir yolu var mı? Ayrıca, güncellenmiş soruya bir göz atın. Teşekkür ederim.
trejder

Bu komut dosyası PHP'de yazılmış iki UDP dinleyicisini yürütüyor. Her ikisi de ( &en sonunda) daemon olarak çalıştırılsa da , buggy sunucusu (QNAP) nedeniyle, oturum sona erdiğinde sonlandırılırlar (bana söylenirse normal Linux'ta çalıştırılmamalılardı &). Bu yüzden start_udp_listeners.shbittikten sonra bir şey yapmaya çalışmıyorum , sadece oturumun sonlandırılmasını nasıl önleyeceğimi merak ediyorum . Olmadığı sürece, PHP dinleyicilerim gayet iyi çalışıyor.
trejder

Yanıtlar:


42

Komut dosyası tamamlandıktan sonra ekranı meşgul etmek için pencerede çalışan bir şeyi kalıcı tutun Bu "şey" için en basit seçenek muhtemelen etkileşimli bir kabuktur. İşte bunu yapmanın bir yolu bash(etkileşimli kabuk seçimi olarak kabul edilir):

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm: ayrılmış modda ekranı başlatır
  • -S: daha sonra daha kolay erişim için ekranın oturum adını belirler
  • sh -c '...': betiğinizi çalıştırmak yerine, sonlanacak komut sh -cbirden çok komutu çalıştırmak için kullanın
  • exec bash: betiğin sona ermesinden sonra, shyukarıdan bir bashşey dışsal bitene kadar asla çıkmaması gereken etkileşimli bir kabuğa ( ) geçecektir . Bu tutacak screensürece açık bashörneği canlıdır.

1
Hm ... sanırım benim hayat kurtarıcımsın! :] export IGNOREEOF=1Ctrl + D ile kaza sonlandırılmasını önlemek için çözümünüzü genişletmek bana mükemmel bir çözüm vermeli, çok uzun zamandır bakıyorum. TEŞEKKÜRLER! :]
trejder

Bu bugün Debian'da işe yaramıyor, -c alternatif bir .screenrc dosyasını okumak için bir argüman ...
ToVine

@ToVine, Debian Stable (Wheezy) ile mükemmel çalışır. bash -cYine de kullandım .
TranslucentCloud

@TranslucentCloud "bash -c ..." komutunun tamamını tırnak işaretleri arasına dahil ettiniz mi? En son denediğimde (yorumu yazmadan hemen önce) benim için işe yaramadı, neden olduğundan emin değilim ...
ToVine

@ToVine buradaki tüm emrim:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud

2

sh -cAhududu pi 2'de Debian 7.8 çalıştıran için hiç şansım olmadı . Ama bash -ciş yaptı:

Komut:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"

Bu olabilir, çünkü (Raspberry Pi'de) farklı bir kabuk kullanıyorsunuz? bashVe shiki farklı kabuklar gibi görünüyor. Hepsi bu, sanırım ama yanılıyor olabilirim, çünkü Linux'a yeni başlamış oldum.
trejder

1
sh, varsayılan unix kabuğudur, raspbian (debian) içine dahil edilir. Sh komutu ayrıca çalışır, ancak sh -c ile ekranla birlikte çalışmaz.
scotty86,

Scotty86 @ Teşekkür ederim, ben Linux Mint 19 (Ubuntu 18.04) aynı gözlenen ve değişen sh -ciçin bash -chile yaptı. İkisini de shve neden bashkurulduğunu anlamıyorum , bu yüzden hala uykum var, ama en azından işe yarıyor.
Redsandro

shmuhtemelen /bin/dashyerine işaret eder /bin/bash. Debian varsayılan kabuk anahtarlı bashiçin dashbirkaç yıl önce.
scai
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.