GNU/Linux >> Belajar Linux >  >> Linux

Apa cara sederhana untuk menjalankan perintah selama 5 menit?

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 proses

SINOPSIS

timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]

dan

NAMA

timeout - jalankan perintah dengan batas waktu

SINOPSIS

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:

  1. timeout selalu menggunakan SIGKILL sebagai sinyal pilihan terakhirnya.
  2. 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

Linux
  1. Apa yang Mendefinisikan Ukuran Maksimum Untuk Argumen Perintah Tunggal?

  2. Apa Yang Terjadi Saat Saya Menjalankan Perintah Cat /proc/cpuinfo?

  3. Cara mudah mengonversi HH:MM:SS (jam:menit:detik.split detik) menjadi detik

  1. Apa artinya 'cd -'?

  2. Apa yang setara dengan perintah updatedb Linux untuk Mac?

  3. Apa yang setara dengan perintah File Linux untuk windows?

  1. Untuk apa Linux test -a command test?

  2. CronJob setiap 25 menit

  3. Sintaks yang tepat untuk perintah id -r