it-swarm-id.com

Bunuh proses setelah bash waktu tertentu?

Saya memiliki skrip yang mencoba membuat koneksi DB menggunakan program lain dan batas waktu (2,5 menit) dari program ini terlalu lama. Saya ingin menambahkan fungsi ini ke skrip.

Jika perlu waktu lebih lama dari 5 detik untuk terhubung, matikan prosesnya
Lain membunuh proses tidur/membunuh.

Masalah yang saya alami adalah bagaimana bash melaporkan ketika suatu proses terbunuh, itu karena prosesnya berada di Shell yang sama hanya di latar belakang. Apakah ada cara yang lebih baik untuk melakukan ini atau bagaimana saya bisa membungkam Shell untuk perintah kill?

DB_CONNECTION_PROGRAM > $CONNECTFILE &
pid=$! 
(sleep 5; kill $pid) &
sleep_pid=$!
wait $pid

# If the DB failed to connect after 5 seconds and was killed
status=$? #Kill returns 128+n (fatal error)
if [ $status -gt 128 ]; then
    no_connection="ERROR: Timeout while trying to connect to $dbserver"
else # If it connected kill the sleep and any errors collect
    kill $sleep_pid
    no_connection=`sed -n '/^ERROR:/,$p' $CONNECTFILE`
fi
25
LF4

Saya tidak tahu apakah itu identik tetapi saya memperbaiki masalah yang sama beberapa tahun yang lalu. Namun saya seorang programmer, bukan sysadmin Unix-like jadi ambil yang berikut dengan sebutir garam karena Bash-fu saya mungkin tidak sekuat itu ...

Pada dasarnya saya melakukan fork, fork dan fork :)

Out of memory Setelah menemukan kembali kode lama saya (yang saya gunakan masih luar biasa setiap hari) karena memori saya tidak cukup baik, di Bash bekerja sedikit seperti ini:

commandThatMayHang.sh 2 > /dev/null 2>&1 &    (notice that last '&', we're forking)
MAYBE_HUNG_PID=$!
sleepAndMaybeKill.sh $MAYBE_HUNG_PID 2 > /dev/null 2>&1 &   (we're forking again)
SLEEP_AND_MAYBE_KILL_PID=$!   
wait $MAYBE_HUNG_PID > /dev/null 2>&1
if [ $? -eq 0 ]
    # commandThatMayHand.sh did not hang, fine, no need to monitor it anymore
    kill -9 $SLEEP_AND_MAYBE_KILL 2> /dev/null 2>&1
fi

di mana sleepAndMaybeKill.sh tidur jumlah waktu yang Anda inginkan dan kemudian membunuh commandThatMayHand.sh .

Jadi pada dasarnya kedua skenario tersebut adalah:

  1. perintah Anda keluar dengan baik (sebelum batas waktu 5 detik atau apa pun) dan jadi tunggu hentikan segera setelah perintah Anda keluar dengan baik (dan bunuh "pembunuh" karena itu tidak diperlukan lagi

  2. perintah terkunci, si pembunuh akhirnya membunuh perintah 

Bagaimanapun Anda dijamin akan berhasil segera setelah perintah selesai atau gagal setelah batas waktu.

10
TacticalCoder

Ada utilitas GNU coreutils yang disebut batas waktu: http://www.gnu.org/s/coreutils/manual/html_node/timeout-invocation.html

Jika Anda memilikinya di platform Anda, Anda bisa melakukan:

timeout 5 CONNECT_TO_DB
if [ $? -eq 124 ]; then
    # Timeout occurred
else
    # No hang
fi
101
Itay Perl

Saya menemukan skrip bash ini timeout.sh Oleh Anthony Thyssen ( webnya ). Kelihatan bagus.

1
waseq

Maksud Anda, Anda tidak ingin pesan kesalahan dicetak jika prosesnya masih belum berjalan? Maka Anda bisa mengarahkan stderr: kill $pid 2>/dev/null.

Anda juga dapat memeriksa apakah prosesnya masih berjalan: 

if ps -p $pid >/dev/null; then kill $pid; fi
0
Kevin