Nohup işini ön plana getirin


14

Aşağıdaki nohupyü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:


7

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 tmuxveya 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


+1 Bilmediğim mükemmel bir araç. Çok teşekkürler.
Adam Matan

19

nohup bir komutun terminalle olan bağlantısını kesmez, komut dosyanızın yoksayılmasını sağlarSIGHUPvestdout/stderrbir dosyayayönlendirirnohup.out, böylece komut oturumu kapattıktan sonra arka planda çalışmaya devam edebilir.

nohupotomatik 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 jobsbulamazsa, 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. initSürece aittir . Arama pstreeyaparsanı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, jobshiç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).
Ruslan

4

İ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:


0

Sadece canlı şapka çıkışı ile ilgileniyorsanız, bu size uygun olabilir:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out

0

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.

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.