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/null
bu kategoriye girer;)
Eğer ona bakarsanız, strace tail -f /dev/null
bu çözümün bloke olmaktan uzak olduğunu fark edeceksiniz! Sistem sleep
gibi 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/null
yapmak 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/sleep
gö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
read
giriş 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.
read
Blok yapmak için fifo
, hiçbir şey döndürmeyecek bir şey beklememiz gerekir . Gelen bash 4
aynen 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 fifo
etmezseniz, 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 fifo
sıklıkta yeniden kullanabilir ve read
s 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 pause
süresiz olarak duraklatan (ihtiyaçlar diet
, gcc
vb.) 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 python
yü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.