Murni bash
dibangun, tanpa coreutils
Saya menemukan bahwa solusi ini bekerja secara bash
mengandalkan built-in perintah tanpa memanggil executable eksternal. Ia bekerja pada sistem di mana akhirnya bahkan tidak diinstal coreutils [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
Penjelasan : seperti biasa ketika Anda mengirim perintah di latar belakang dengan &
, PID yang disimpan ke dalam variabel internal $!
(hadir dalam versi modern dash
, csh
, bash
, tcsh
, zsh
...).
Apa yang benar-benar membuat perbedaan di antara kerang adalah kehadiran built-in command read
[ 2 ] dan opsi -t
. Dalam versi 1 jika pengguna tidak akan menyelesaikan jalur input sebelum jumlah detik yang ditentukan instruksi akan dihentikan dan kode pengembalian kesalahan akan dihasilkan.
-T TIMEOUT Menyebabkan pembacaan waktu habis dan kegagalan kembali jika jalur input lengkap tidak terbaca dalam TIMEOUT detik.
Versi kedua berfungsi sebagai yang pertama tetapi Anda dapat membatalkan batas waktu pembunuhan hanya dengan menekan enter.
Memang operator atau ||
menjalankan kill
pernyataan hanya jika read
perintah keluar dengan kode kembali berbeda dari nol, seperti ketika batas waktu berakhir. Jika Anda menekan entersebelum saat itu, itu akan mengembalikan 0 dan itu tidak akan membunuh perintah Anda sebelumnya.
Solusi Coreutils [ 1 ]
Ketika coreutils hadir pada sistem Anda dan Anda tidak perlu menghemat waktu dan sumber daya untuk memanggil program eksternal, timeout
dan sleep
keduanya merupakan cara sempurna untuk mencapai tujuan Anda.
timeout
Penggunaannya timeout
sangat mudah.
Akhirnya Anda dapat mempertimbangkan untuk menggunakan juga -k
opsi untuk mengirim sinyal kill tambahan jika yang pertama gagal.
timeout 5m YourCommand # 3rd version
sleep
Dengan sleep
Anda dapat menggunakan fantasi Anda atau mengambil beberapa inspirasi [ 3 ] . Perhatikan bahwa Anda dapat meninggalkan perintah di latar belakang atau di latar depan (misalnya top
biasanya harus di latar depan).
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
Penjelasan
- Pada versi ke-4 Anda mengeksekusi di latar belakang
YourCommand
maka shell Anda sleep
untuk 5 minuites. Ketika akan selesai proses latar belakang terakhir ( $!
) akan dibunuh. Anda menghentikan shell Anda.
-
Di versi ke-5 alih-alih Anda mengeksekusi di latar belakang
YourCommand
dan Anda segera menyimpan PID dalam variabel $pid
. Kemudian Anda menjalankan di latar belakang tidur siang 5 menit dan perintah konsekuensinya yang akan membunuh PID yang disimpan. Karena Anda mengirim grup perintah ini di latar Anda tidak menghentikan shell Anda. Anda perlu menyimpan PID dalam variabel karena nilai $!
dapat diperbarui dengan eksekusi program lain di latar belakang. Dengan kata-kata sederhana Anda menghindari risiko untuk membunuh proses yang salah atau tidak ada proses sama sekali.
- Dalam versi ke-6 itu disebut bash shell baru yang akan bunuh diri dalam 5 menit
$$
, kemudian dieksekusi perintah Anda yang tetap di latar depan.
- Dalam versi ke-7 itu dipanggil subkulit
()
yang menyimpan PID-nya dalam variabel ( cmdpid
) dan bunuh diri dengan subkulit lain yang dikirim dalam eksekusi latar belakang, kemudian jalankan YourCommand di latar depan.
Tentu saja di setiap versi Anda dapat mengirim sinyal bunuh yang Anda butuhkan, dari yang standar ke yang ekstrem kill -9
, hanya untuk digunakan ketika benar-benar diperlukan.
Referensi
- [ 1 ] The Coreutils
- [ 2 ] Panduan Pemula Bash
- [ 3 ] BashFAQ