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"