Sebenarnya, inilah timeout
adalah untuk:
TIMEOUT(1) User Commands TIMEOUT(1)
NAME
timeout - run a command with a time limit
SYNOPSIS
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
DESCRIPTION
Start COMMAND, and kill it if still running after DURATION.
[email protected]:~$ dpkg -S /usr/bin/timeout
coreutils: /usr/bin/timeout
Ada (setidaknya) dua program yang menyediakan fungsi ini:
NAMA
timelimit
— secara efektif membatasi waktu eksekusi absolut dari suatu prosesSINOPSIS
timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]
dan
NAMA
timeout
- jalankan perintah dengan batas waktuSINOPSIS
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
Mereka dikemas sebagai berikut:
$ dlocate `which timeout timelimit`
timelimit: /usr/bin/timelimit
coreutils: /usr/bin/timeout
Perbandingan:
/-----------------------------+------------+----------------\
| Feature | timelimit | timeout |
+=============================+============+================+
| time to run | -t time | first argument |
+-----------------------------+------------+----------------+
| terminate signal | -s signal | -s signal |
+-----------------------------+------------+----------------+
| grace period | -T time | -k time |
+-----------------------------+------------+----------------+
| kill signal | -S signal | (note 1) |
+-----------------------------+------------+----------------+
| propagate signals | -p | (note 2) |
\-----------------------------+------------+----------------/
Catatan:
timeout
selalu menggunakanSIGKILL
sebagai sinyal pilihan terakhirnya.timeout
tidak memiliki fungsi apa pun untuk keluar dengan sinyal saat program anak melakukannya.
Status keluar dari kedua program berbeda, tetapi sulit untuk diringkas dengan rapi, jadi saya sarankan Anda membaca sendiri halaman manual untuk itu.
Sebagai timeout
diinstal pada lebih banyak sistem secara default (coreutils
adalah paket standar di banyak distribusi), saya sarankan Anda menggunakannya kecuali Anda memerlukan fungsionalitas tambahan yang disediakan oleh timelimit
.
Murni bash
bawaan, tanpa coreutils
Saya menemukan bahwa solusi ini berfungsi di bash
mengandalkan bawaan perintah tanpa memanggil executable eksternal. Ia bekerja pada sistem di mana pada akhirnya coreutils bahkan belum diinstal
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
Penjelasan :seperti biasa saat Anda mengirim perintah di latar belakang dengan &
, PID-nya disimpan ke dalam variabel internal $!
(hadir dalam versi modern dash
, csh
, bash
, tcsh
, zsh
...).
Apa yang benar-benar membuat perbedaan di antara shell adalah adanya built-in perintah read
dan opsi -t
.Dalam versi pertama jika pengguna tidak menyelesaikan satu baris input sebelum jumlah detik yang ditentukan, instruksi akan dihentikan dan kode pengembalian kesalahan akan dihasilkan.
Versi kedua berfungsi sebagai yang pertama tetapi Anda dapat membatalkan batas waktu pembunuhan hanya dengan menekan enter .
Memang operator atau ||
mengeksekusi kill
pernyataan hanya jika read
perintah keluar dengan kode pengembalian berbeda dari nol, seperti saat batas waktu kedaluwarsa. Jika Anda menekan masuk sebelum saat itu, itu akan mengembalikan 0 dan itu tidak akan mematikan perintah Anda sebelumnya.
solusi Coreutils
Saat coreutils hadir di sistem Anda dan Anda tidak perlu menghemat waktu dan sumber daya untuk memanggil program eksternal, timeout
dan sleep
dan keduanya merupakan cara sempurna untuk mencapai tujuan Anda.
timeout
Penggunaan timeout
mudah.
Akhirnya Anda dapat mempertimbangkan untuk menggunakan juga -k
opsi untuk mengirim sinyal pemutus tambahan jika yang pertama gagal.
timeout 5m YourCommand # 3rd version
sleep
Dengan sleep
Anda dapat menggunakan fantasi Anda atau mengambil beberapa inspirasi. Perhatikan bahwa Anda dapat membiarkan perintah Anda di latar belakang atau di latar depan (mis. top
biasanya perlu 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
Tentu saja di setiap versi Anda dapat mengirimkan sinyal mati yang Anda butuhkan, dari yang default hingga yang ekstrim kill -9
, untuk digunakan hanya saat benar-benar dibutuhkan.
Referensi
- [1] Coreutils
- [2] Panduan Pemula Bash
- [3] BashFAQ