Jalankan skrip dengan bash dan berikan waktu terminasi [duplikat]

6

Pertanyaan ini sudah ada jawabannya di sini:

Apakah mungkin menjalankan skrip dari bash (mis. Python) dengan waktu penghentian, artinya jika skrip ini berjalan lebih dari X detik, hentikan?

Wells
sumber

Jawaban:

5

Ya, Dimungkinkan untuk menjalankan skrip bash dengan batas waktu untuk penghentiannya. Anda dapat melakukannya dengan:

1. Menggunakan waktu habis :

Ini menjalankan perintah dengan batas waktu. Sintaks umum meliputi:

timeout signal duration command/script arguments

dimana:

  • sinyal adalah nama sinyal atau nomor yang sesuai. Lihat sinyal manusia 7
  • Durasi adalah Batas waktu yang ditentukan dalam angka dengan akhiran sebagai s selama beberapa detik, m selama beberapa menit, h selama berjam-jam , d berhari-hari.
  • Default adalah detik, Ketika Anda hanya menentukan angka saja. Sebagai contoh katakan Anda ingin menghentikan skrip Anda setelah 2 menit, lalu:

    timeout 2m /path/to/script arg1 arg2
    
  • NOTE : Sinyal batas waktu default adalah SIGTERM di mana beberapa proses tidak berakhir. Dalam hal ini kita perlu menggunakan SIGKILL sinyal untuk mematikan proses.

        timeout -s KILL 2m /path/to/script arg1 arg2
    

    ATAU

        timeout -k 30 2m /path/to/slow-command arg1 arg2
    

    Dalam hal ini, batas waktu pertama mengirim SIGTERM sinyal setelah batas waktu awal 2 menit. Kemudian, tunggu batas waktu 30 detik dan kirim a SIGKILL ke proses jika masih berjalan.

2. saya tidak punya timeout perintah:

Ada banyak alternatif atau solusi, Jika karena alasan tertentu Anda tidak dapat menggunakan timeout. Ini adalah:

  1. Kondisi sleep kemudian kill :

       /path/to/script arg1 arg2 & sleep 2m ; kill $!
    
  2. Perl Alarms (Ini dapat digunakan dalam skrip berurutan.):

       perl -e "alarm 120; exec @ARGV" "/path/to/script arg1 arg2"
    
  3. Menggunakan mengharapkan perintah:

       time_out=120
       command="/path/to/script arg1 arg2"
    
       expect -c " set echo \"-noecho\";
                   set timeout $time_out;
                   spawn -noecho $command;
                   expect timeout { exit 1 } eof { exit 0 } "
    

Jangan ragu untuk menambahkan detail lebih lanjut.

C0deDaedalus
sumber