Saya memiliki perintah yang ingin saya jalankan lagi secara otomatis setiap kali berakhir, jadi saya menjalankan sesuatu seperti ini:
while [ 1 ]; do COMMAND; done;
tetapi jika saya tidak bisa menghentikan loop dengan Ctrl-ckarena hanya membunuh COMMAND
dan bukan seluruh loop.
Bagaimana saya bisa mencapai sesuatu yang serupa tetapi saya bisa berhenti tanpa harus menutup terminal?
Jawaban:
Periksa status keluar dari perintah. Jika perintah diakhiri oleh sinyal, kode keluar akan menjadi 128 + nomor sinyal. Dari dokumentasi online GNU untuk bash :
POSIX juga menentukan bahwa nilai perintah yang diakhiri oleh sinyal lebih besar dari 128, tetapi tampaknya tidak menentukan nilai persisnya seperti yang dilakukan GNU:
Sebagai contoh jika Anda mengganggu perintah dengan kontrol-C kode keluar akan menjadi 130, karena SIGINT adalah sinyal 2 pada sistem Unix. Begitu:
sumber
paplay alert.ogg
, mungkin karenapaplay
menangani sinyal?Anda bisa berhenti dan meletakkan pekerjaan Anda di latar belakang saat sedang berjalan menggunakan ctrl+ z. Maka Anda dapat membunuh pekerjaan Anda dengan:
Di mana [1] adalah nomor pekerjaan Anda.
sumber
Saya akan mengatakan itu mungkin yang terbaik untuk menempatkan loop tak terbatas Anda dalam skrip dan menangani sinyal di sana. Inilah titik awal dasar . Saya yakin Anda ingin memodifikasinya sesuai. Script digunakan
trap
untuk menangkap ctrl- c(atauSIGTERM
), mematikan perintah (Saya telah menggunakan disleep
sini sebagai tes) dan keluar.sumber
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
pendekatan ini ke skrip (bash) yang sama dengan loop tak terhingga untuk dibunuh, gunakan$$
alih-alih$!
(lihat di sini )Saya biasanya hanya tahan Ctrl-C. Cepat atau lambat itu akan mendaftar antara
COMMAND
dan dengan demikian mengakhiriwhile
loop. Mungkin ada cara yang lebih baik.sumber
paplay
pada file 1s.Jika Anda menjalankan bash
-e
dengannya akan keluar pada kondisi kesalahan apa pun:sumber
Kenapa tidak sederhana saja,
Atau saat digunakan dalam naskah,
sumber
Saya lebih suka solusi lain:
Untuk mematikan loop, lakukan saja:
sumber
while :
akan membuat loop tak terbatas dan menghemat Anda menulis[ 1 ]
Ini akan mencetak PID. Jika Anda keluar dari prompt Anda menggunakan
ctrl+d
maka pekerjaan latar belakang tidak akan berhenti, dan Anda kemudian dapat membunuh pekerjaan dari mana saja menggunakankill PID
Jika Anda kehilangan jejak PID Anda, Anda dapat menggunakan
pstree -pa $USER
ataupgrep -fl '.*PROCESS.*'
untuk membantu Anda menemukannyasumber
Gunakan
trap
-sumber