Aşağıdaki nohup
yürütmeyi düşünün :
nohup script.sh > script.out &
Terminalden çıkış yapmanın, yeniden bağlanmanın, işlemi tekrar ön plana çıkarmanın ve klavyeyi kullanarak etkileşim kurmanın bir yolu var mı?
Aşağıdaki nohup
yürütmeyi düşünün :
nohup script.sh > script.out &
Terminalden çıkış yapmanın, yeniden bağlanmanın, işlemi tekrar ön plana çıkarmanın ve klavyeyi kullanarak etkileşim kurmanın bir yolu var mı?
Yanıtlar:
Bir komut dosyasını başlatmak istiyorsanız, çıkış terminalinizi rahatsız etmeden çalıştırın ve daha sonra onunla etkileşime geçmek için getirin, bir terminal çoklayıcısına bakmak isteyebilirsiniz. Sisteminize bağlı olarak tavsiye ederim tmux
veya screen
. Bunların nasıl kullanılacağı hakkında bazı bilgileri aşağıdaki bağlantılarda bulabilirsiniz:
tmux:
ekran:
değiştir: tmux primerleri için eklenen bağlantılar
nohup bir komutun terminalle olan bağlantısını kesmez, komut dosyanızın yoksayılmasını sağlarSIGHUP
vestdout/stderr
bir dosyayayönlendirirnohup.out
, böylece komut oturumu kapattıktan sonra arka planda çalışmaya devam edebilir.
nohup
otomatik olarak arka planda çalıştırdığı komutu koymaz. Komut satırını bir ile sonlandırarak bunu açıkça yapmak gerekir &
.
$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’
jobs
çalışmakta olan işleri ve durumlarını yazdırabilir. Komut jobs
bulamazsa, artık bu kabuğun alt işlemi değildir .
$ jobs
[1]+ Running nohup ./script.sh &
Bir arka plan işi ile fg
çalıştırılsa bile bash ön plana geri getirilebilir nohup
. Ancak bu, yine de dosyaya gidecek olan çıktı yönlendirmesininohup.out
değiştirmez .
$ fg
nohup ./script.sh
Kabuğu / terminali kapatırsanız veya oturumu kapatırsanız, komutunuz artık bu kabuğun alt öğesi değildir. init
Sürece aittir . Arama pstree
yaparsanız, şimdi işlem 1 ( init
) 'e ait olduğunu göreceksiniz . Bu ön plana geri getirilemez çünkü ön plan artık mevcut değildir.
If the command jobs cannot find it, then it is no longer a child process of that shell.
Bu yanlıştır: nasıl çalıştığını görmek için bu sırayı deneyin: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$
. Bu komuttan sonra sleep
, aynı PID ile çıktığınızda yazdırıldığınızı görürsünüz, jobs
hiçbir şey yazdırmaz. Bir çocuk sürecinin çocuk olmayı durdurabilmesinin tek yolu ebeveynini kaybetmektir (o zaman yetim çocuğu olur init
) veya çatallı + çıkış (ama sonra PID değişir, bu yüzden orijinal çocuk değildir).
İkinci olarak bir terminal çoklayıcı kullanacağım, ama ekran değil tmux . Ekran, tüm amaçlar ve amaçlar için korunmaz. Konfigürasyonu, muhtemelen ilk olarak Necronomicon'un bir ekinde kaydedilen karanlık bir sanattır. Kendi yapılandırmanızı yazmaya çalışmak Cthulu'ya bir bakış gibidir. Ciddi anlamda. İnsanların .screenrc dosyalarına bakın . Emin olmak için, ekranın bir yapılandırma flle'yle uğraşmasına aracılık etmenin yolları vardır. Byobu , ölümlü kullanıcılar ve kutsal olmayan kod arasında bir örtü olarak takdire şayan bir iş çıkarıyor. Mantıklı renkler, bir menü arayüzü ve belki de en önemlisi bir durum çubuğu ile birlikte gelir.
Ama dediğim gibi, bunun yerine tmux öneririm . Yine de bazı küçük yapılandırmalar gerektirir, ancak iyi belgelenmiştir ve yapılandırma dosyanız anlamsız görünmeyecektir. Ayrıca, renkler ve bir durum çubuğu ile başlarsınız. Screenrc ve tmux.conf dosyalarımı karşılaştırın:
Herhangi bir Linux komutu arka plana en sonunda ' &
' eklenerek gönderilebilir .
Tüm arka plan işlerini görüntülemek için jobs
jobs
[1] + suspended nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2] running nohup sh kafka-server-start.sh ../config/server.properties
[3] - running nohup sudo mongod --dbpath=/var/lib/mongodb
Burada arka planda 3 iş yapıyorum: zookeeper, kafka ve mongo daemon. [1], [2] ve [3] bu görevler için ilgili iş numaralardır.
Bu görevi kullanarak ön plana getirebilirsiniz. fg %$taskNumber.