tail tidak menghalangi
Seperti biasa: Untuk semuanya ada jawaban yang pendek, mudah dimengerti, mudah diikuti dan sepenuhnya salah. Di sini tail -f /dev/nulltermasuk dalam kategori ini;)
Jika Anda melihatnya dengan strace tail -f /dev/nullAnda akan melihat, bahwa solusi ini jauh dari pemblokiran! Ini mungkin bahkan lebih buruk daripada sleepsolusi dalam pertanyaan, karena menggunakan sumber daya berharga (di Linux) seperti inotifysistem. Juga proses lain yang menulis untuk /dev/nullmembuat taillingkaran. (Pada Ubuntu64 16.10 saya, ini menambahkan beberapa 10 syscalls per detik pada sistem yang sudah sibuk.)
Pertanyaannya adalah untuk perintah pemblokiran
Sayangnya, tidak ada yang namanya ..
Baca: Saya tidak tahu cara mengarsipkan ini dengan shell secara langsung.
Semuanya (datar sleep infinity) dapat terganggu oleh beberapa sinyal. Jadi jika Anda ingin benar-benar yakin itu tidak kembali, itu harus dijalankan dalam satu lingkaran, seperti yang sudah Anda lakukan untuk Anda sleep. Harap dicatat, bahwa (di Linux) /bin/sleeptampaknya dibatasi dalam 24 hari (lihatlah strace sleep infinity), maka yang terbaik yang dapat Anda lakukan adalah:
while :; do sleep 2073600; done
(Perhatikan bahwa saya percaya sleeploop internal untuk nilai yang lebih tinggi dari 24 hari, tetapi ini berarti: Ini tidak memblokir, looping sangat lambat. Jadi mengapa tidak memindahkan loop ini ke luar?)
.. tetapi Anda bisa datang cukup dekat dengan yang tidak disebutkan namanya fifo
Anda dapat membuat sesuatu yang benar-benar menghalangi selama tidak ada sinyal yang dikirim ke proses. Penggunaan berikut bash 4, 2 PID dan 1 fifo:
bash -c 'coproc { exec >&-; read; }; eval exec "${COPROC[0]}<&-"; wait'
Anda dapat memeriksa apakah ini benar-benar diblokir stracejika Anda suka:
strace -ff bash -c '..see above..'
Bagaimana ini dibangun
readblok jika tidak ada data input (lihat beberapa jawaban lain). Namun, tty(alias. stdin) Biasanya bukan sumber yang baik, karena ditutup ketika pengguna logout. Juga mungkin mencuri beberapa masukan dari tty. Tidak baik.
Untuk membuat readblok, kita perlu menunggu sesuatu seperti fifoyang tidak akan pernah mengembalikan apa pun. Dalam bash 4ada perintah yang tepat dapat memberikan kita dengan seperti fifo: coproc. Jika kita juga menunggu pemblokiran read(yang merupakan milik kita coproc), kita selesai. Sayangnya ini harus tetap membuka dua PID dan a fifo.
Varian dengan nama fifo
Jika Anda tidak ingin menggunakan nama fifo, Anda bisa melakukan ini sebagai berikut:
mkfifo "$HOME/.pause.fifo" 2>/dev/null; read <"$HOME/.pause.fifo"
Tidak menggunakan perulangan pada proses baca agak ceroboh, tetapi Anda dapat menggunakan kembali ini fifosesering mungkin dan membuat readterminat menggunakan touch "$HOME/.pause.fifo"(jika ada lebih dari satu menunggu baca, semua diakhiri sekaligus).
Atau gunakan pause()syscall Linux
Untuk pemblokiran tak terbatas ada panggilan kernel Linux, yang disebut pause(), yang melakukan apa yang kita inginkan: Tunggu selamanya (sampai sinyal tiba). Namun tidak ada program userspace untuk ini (belum).
C
Membuat program seperti itu mudah. Berikut ini cuplikan untuk membuat program Linux yang sangat kecil yang disebut pausejeda tanpa batas waktu (kebutuhan diet, gccdll.):
printf '#include <unistd.h>\nint main(){for(;;)pause();}' > pause.c;
diet -Os cc pause.c -o pause;
strip -s pause;
ls -al pause
python
Jika Anda tidak ingin mengkompilasi sesuatu sendiri, tetapi Anda telah pythonmenginstalnya, Anda dapat menggunakan ini di Linux:
python -c 'while 1: import ctypes; ctypes.CDLL(None).pause()'
(Catatan: Gunakan exec python -c ...untuk mengganti shell saat ini, ini membebaskan satu PID. Solusinya dapat ditingkatkan dengan beberapa pengalihan IO juga, membebaskan FD yang tidak terpakai. Ini terserah Anda.)
Bagaimana ini bekerja (saya pikir): ctypes.CDLL(None)memuat perpustakaan C standar dan menjalankan pause()fungsi di dalamnya dalam beberapa loop tambahan. Kurang efisien daripada versi C, tetapi berfungsi.
Rekomendasi saya untuk Anda:
Menginap di tidur berulang. Sangat mudah dipahami, sangat portabel, dan hampir selalu memblokir.