GNU/Linux >> Belajar Linux >  >> Linux

batas waktu tanpa proses pembunuhan di bash

Dengan ksh/bash/zsh:

{
  (./slowprocess.sh >&3 3>&-; echo "$?") |
    if read -t 3 status; then
      echo "Cool it completed with status $status, do stuff..."
    else
      echo "It didn't complete, do something else..."
    fi
} 3>&1

Kami menduplikasi stdout asli ke fd 3 (3>&1 ) agar kami dapat memulihkannya untuk slowprocess.sh (>&3 ), sedangkan stdout untuk sisa (...) subkulit menuju ke pipa ke read -t 3 .

Alternatifnya, jika Anda ingin menggunakan timeout (di sini dengan asumsi GNU timeout ):

timeout --foreground 3 sh -c './slowprocess.sh;exit'

akan menghindari slowprocess.sh dibunuh (;exit diperlukan untuk sh implementasi yang dioptimalkan dengan menjalankan perintah terakhir dalam proses shell).


Inilah solusi yang hanya menggunakan alat shell yang ada di mana-mana.

Ini harus mudah dilakukan dengan melakukan forking pada proses yang lambat dan sleep di latar belakang dan menunggu yang pertama selesai, kecuali wait shell bawaan menunggu semua pekerjaan untuk diselesaikan daripada hanya untuk yang pertama.

Jadi alih-alih, hentikan proses yang lambat dan sleep di latar belakang, minta mereka berdua melaporkan statusnya melalui pipa, dan membaca status pertama yang keluar dari pipa.

fifo=$(mktemp -u)  # if not on Linux, adapt to what your OS provides
mkfifo -m 600 "$fifo"
{ ./slowprocess.sh; echo z >"$fifo"; } &
sh -c 'sleep 3; echo a' >"$fifo" &
sleep_pgid=$!
read status <$fifo
case $status in
  a) echo "That process is taking a long time"; read ignored <$fifo;;
  z) echo "Done already"; kill -INT -$sleep_pgid;;
esac
rm "$fifo"

Linux
  1. Bagaimana cara membunuh proses anak setelah batas waktu tertentu di Bash?

  2. Bash/sh pernyataan 'jika lain'

  3. Sejarah Bash tanpa nomor baris

  1. Membunuh zombie, gaya Linux

  2. Periksa apakah ada variabel dalam daftar di Bash

  3. Bagaimana cara melepaskan sesi ssh tanpa mematikan proses yang sedang berjalan?

  1. Bagaimana Menggemakan Bang!?

  2. Periksa Proses Jika Sama Sedang Berjalan?

  3. Menggunakan Pernyataan Kasus di Bash