tail engellemez
Her zamanki gibi: Her şey için kısa, anlaşılması kolay, takip edilmesi kolay ve tamamen yanlış bir cevap var. İşte tail -f /dev/nullbu kategoriye girer;)
Eğer ona bakarsanız, strace tail -f /dev/nullbu çözümün bloke olmaktan uzak olduğunu fark edeceksiniz! Sistem sleepgibi değerli kaynakları (Linux altında) kullandığı için muhtemelen sorunun çözümünden bile daha kötüdür inotify. Ayrıca döngü /dev/nullyapmak için yazma diğer süreçler tail. (Ubuntu64 16.10 cihazımda, zaten meşgul bir sistemde saniyede birkaç sistem çağrısı ekleniyor.)
Soru engelleme komutuydu
Maalesef böyle bir şey yok ..
Oku: Bunu doğrudan kabukla arşivlemenin bir yolunu bilmiyorum.
Her şey (çift sleep infinity) bir sinyalle kesilebilir. Bu yüzden son derece geri dönmediğinden emin olmak istiyorsanız, sizin için zaten yaptığınız gibi bir döngüde çalışmalıdır sleep. (Linux'ta) /bin/sleepgörünüşe göre 24 günde kapatıldığını (bir göz atın strace sleep infinity), bu nedenle muhtemelen yapabileceğiniz en iyisi:
while :; do sleep 2073600; done
( sleepİçeride 24 günden daha yüksek değerler için döngüler olduğuna inanıyorum , ancak bu şu anlama geliyor: Engellemiyor, çok yavaş döngü yapıyor. Öyleyse neden bu döngüyü dışarıya taşımıyorsunuz?)
.. ama adsız biriyle oldukça yaklaşabilirsiniz fifo
İşleme gönderilen sinyal olmadığı sürece gerçekten engelleyen bir şey oluşturabilirsiniz. Aşağıdaki kullanımlar bash 4, 2 PID ve 1 fifo:
bash -c 'coproc { exec >&-; read; }; eval exec "${COPROC[0]}<&-"; wait'
İsterseniz bunun gerçekten engellenip engellenmediğini kontrol edebilirsiniz strace:
strace -ff bash -c '..see above..'
Bu nasıl inşa edildi
readgiriş verisi yoksa engeller (başka cevaplara bakınız). Ancak, tty(aka. stdin) Kullanıcı oturumu kapattığında kapatıldığı için genellikle iyi bir kaynak değildir. Ayrıca bazı girişleri çalabilir tty. İyi değil.
readBlok yapmak için fifo, hiçbir şey döndürmeyecek bir şey beklememiz gerekir . Gelen bash 4aynen böyle a bize bir komut vardır fifo: coproc. Eğer read(ki bizim coproc) engelleme de beklersek , biz yapılır. Ne yazık ki bunun iki PID ve a fifo.
Adlandırılmış bir varyant fifo
Bir adlandırılmış kullanarak rahatsız fifoetmezseniz, bunu aşağıdaki gibi yapabilirsiniz:
mkfifo "$HOME/.pause.fifo" 2>/dev/null; read <"$HOME/.pause.fifo"
Okumada bir döngü kullanmamak biraz özensizdir, ancak bunu istediğiniz fifosıklıkta yeniden kullanabilir ve reads terminatını kullanaraktouch "$HOME/.pause.fifo" (tek bir okuma beklemeden daha fazlası varsa, hepsi aynı anda sonlandırılır).
Veya Linux pause()sistem çağrısını kullanın
Sonsuz engelleme için, pause()istediğimiz şeyi yapan bir Linux çekirdek çağrısı var : Sonsuza kadar bekleyin (bir sinyal gelene kadar). Ancak bunun için henüz bir kullanıcı alanı programı bulunmamaktadır.
C
Böyle bir program oluşturmak kolaydır. İşte pausesüresiz olarak duraklatan (ihtiyaçlar diet, gccvb.) Adlı çok küçük bir Linux programı oluşturmak için bir snippet :
printf '#include <unistd.h>\nint main(){for(;;)pause();}' > pause.c;
diet -Os cc pause.c -o pause;
strip -s pause;
ls -al pause
python
Kendiniz bir şey derlemek istemiyorsanız, ancak pythonyüklediyseniz, bunu Linux altında kullanabilirsiniz:
python -c 'while 1: import ctypes; ctypes.CDLL(None).pause()'
(Not: Kullanın exec python -c ... Mevcut kabuğu değiştirmek için , bu bir PID'yi serbest bırakır. Çözüm, bazı IO yönlendirmeleriyle de geliştirilebilir, kullanılmayan FD'leri serbest bırakır. Bu size kalmış.)
Bu nasıl çalışır (Sanırım): ctypes.CDLL(None)standart C kitaplığını yükler ve pause()bazı ek döngü içinde işlevini çalıştırır . C sürümünden daha az verimli, ancak çalışıyor.
Size tavsiyem:
Döngü uykusunda kalın. Anlaması kolay, çok taşınabilir ve çoğu zaman engeller.