Ada (setidaknya) dua program yang menyediakan fungsi ini:
NAMA
timelimit
- secara efektif membatasi waktu eksekusi absolut dari suatu proses
RINGKASAN
timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]
dan
NAMA
timeout
- jalankan perintah dengan batas waktu
RINGKASAN
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 digunakan SIGKILL
sebagai sinyal pilihan terakhir.
timeout
tidak memiliki fungsi apa pun untuk keluar dengan sinyal ketika program anak melakukannya.
Status keluar dari kedua program berbeda, tetapi itu sulit untuk diringkas dengan rapi, jadi saya sarankan Anda membaca sendiri halaman buku panduan untuk itu.
Seperti timeout
yang 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
.
timelimit
. Lihat Bagaimana saya bisa mematikan proses dan pastikan PID belum digunakan kembali untuk info lebih lanjut tentang mereka dan batas waktu GNU.timeout
termasuk dalam GNU coreutils ,timelimit
bukan. Anda dapat menginstal tidak ada, satu atau keduanya. Untuk yang kedua dilaporkan timelimit mengeksekusi sebuah perintah dan mengakhiri proses spawned setelah waktu tertentu dengan sinyal yang diberikan. Sinyal "peringatan" dikirim terlebih dahulu , kemudian, setelah batas waktu, sinyal "bunuh", mirip dengan cara init (8) beroperasi pada shutdown. Begitu pun berbeda di tengah perilaku.timeout
adalah cara untuk pergi ke sana.Sebenarnya, ini
timeout
untuk:sumber
Murni
bash
dibangun, tanpa coreutilsSaya 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 ]Penjelasan : seperti biasa ketika Anda mengirim perintah di latar belakang dengan
&
, PID yang disimpan ke dalam variabel internal$!
(hadir dalam versi moderndash
,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.Versi kedua berfungsi sebagai yang pertama tetapi Anda dapat membatalkan batas waktu pembunuhan hanya dengan menekan enter.
Memang operator atau
||
menjalankankill
pernyataan hanya jikaread
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
dansleep
keduanya merupakan cara sempurna untuk mencapai tujuan Anda.timeout
Penggunaannyatimeout
sangat mudah.Akhirnya Anda dapat mempertimbangkan untuk menggunakan juga
-k
opsi untuk mengirim sinyal kill tambahan jika yang pertama gagal.sleep
Dengansleep
Anda dapat menggunakan fantasi Anda atau mengambil beberapa inspirasi [ 3 ] . Perhatikan bahwa Anda dapat meninggalkan perintah di latar belakang atau di latar depan (misalnyatop
biasanya harus di latar depan).Penjelasan
YourCommand
maka shell Andasleep
untuk 5 minuites. Ketika akan selesai proses latar belakang terakhir ($!
) akan dibunuh. Anda menghentikan shell Anda.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.$$
, kemudian dieksekusi perintah Anda yang tetap di latar depan.()
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
sumber
Untuk kasus khusus Anda, sebagian besar implementasi
ping
dukungan-c
atau--count
untuk mengakhiri setelah sejumlah ping:Untuk solusi yang lebih umum, lihat jawaban lainnya.
sumber
ping
contoh konkret. Dia tidak menginginkan solusi kasus per kasus untuk setiap program yang berbeda.Anda dapat melakukannya dengan skrip sederhana seperti ini:
(sinyal SIGINT = 2 digunakan sesuai saran Matija Nalis dalam komentar di bawah).
Penjelasan tentang ekspresi bash (tidak umum?)
$@:...
: Parameter posisi, ($*, $@, "$*", "$@"
) mengakui spesifikasi tambahan berikut, misalnya:yang berarti: dari semua parameter, ambil COUNT dari mereka, yang pertama diambil adalah bahwa pada posisi MULAI; jika COUNT dihilangkan, ambil semuanya sampai akhir, dimulai dengan posisi MULAI. Ingat itu
$0
adalah nama programnya. Jika MULAI negatif, mulailah menghitung dari akhir, dan ingat bahwa COUNT tidak boleh negatif, maka argumen terakhir adalah"${@:-1}"
. Juga, hampir selalu menyertakan parameter posisi di dalam tanda kutip ganda.sumber
$1
sangat kotor. Anda juga bisa memasukkansleep "$1"
sesuatucountdown
.time=$1; shift
, dan kemudian Anda tidak perlu sintaks array-slicing untuk parameter posisi. Tapi ya, itu jauh lebih sederhana.ctrl-c
, mungkin lebih baik untuk mencobakill -INT
daripadakill -9
(atau setidaknya mencoba-9
hanya setelah beberapa detik jika yang pertama tidak berhasil - itu memberi peluang program untuk keluar dengan bersih dan tidak meninggalkan file sementara dll sekitar)Karena Anda menyebutkan
ping
dalam contoh Anda; perintah ini memiliki beberapa opsi untuk berhenti setelah waktu tertentu:sumber