tail
tidak menghalangi
Seperti biasa: Untuk semuanya ada jawaban yang pendek, mudah dimengerti, mudah diikuti dan sepenuhnya salah. Di sini tail -f /dev/null
termasuk dalam kategori ini;)
Jika Anda melihatnya dengan strace tail -f /dev/null
Anda akan melihat, bahwa solusi ini jauh dari pemblokiran! Ini mungkin bahkan lebih buruk daripada sleep
solusi dalam pertanyaan, karena menggunakan sumber daya berharga (di Linux) seperti inotify
sistem. Juga proses lain yang menulis untuk /dev/null
membuat tail
lingkaran. (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/sleep
tampaknya 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 sleep
loop 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 strace
jika Anda suka:
strace -ff bash -c '..see above..'
Bagaimana ini dibangun
read
blok 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 read
blok, kita perlu menunggu sesuatu seperti fifo
yang tidak akan pernah mengembalikan apa pun. Dalam bash 4
ada 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 fifo
sesering mungkin dan membuat read
terminat 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 pause
jeda tanpa batas waktu (kebutuhan diet
, gcc
dll.):
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 python
menginstalnya, 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.