Nilai pengembalian fungsi waktu habis

9

Saya menggunakan fungsi batas waktu pada debian untuk menunggu 5 detik untuk skrip saya. Bekerja dengan baik tetapi masalah yang saya miliki adalah bahwa saya membutuhkan nilai kembali. Suka 1 untuk batas waktu dan 0 tanpa batas waktu Bagaimana saya akan melakukan ini?

Lihatlah kode saya:

timeout 5 /some/local/script/connect_script -x 'status' > output.txt
# here i need the return of timeout

Seperti yang Anda lihat connect_script saya -x 'status' mengembalikan status sebagai string dan mencetaknya ke layar (mungkin Anda tidak dapat melihat ini) Latar belakang masalah ini adalah bahwa jika server (untuk connect_script) dibekukan, skrip tidak melakukan apa-apa . Itu sebabnya saya perlu batas waktu sekitar itu. Dan ketika timeout saya ingin me-restart server. Saya bisa melakukan itu, tetapi saya tidak tahu bagaimana saya bisa melihat apakah waktu habis atau tidak ...

Nol
sumber

Jawaban:

19

Jika timeoutwaktu habis, ia keluar dengan status 124 ; Anda dapat memeriksa ini untuk menentukan apakah skrip waktunya atau tidak.

Stephen Kitt
sumber
Ya terima kasih. Saya melewatkan ini di manual. @Christopher memposting jawaban yang cocok untuk saya. Saya tidak tahu $? sintaksis. Jadi kedua jawaban Anda benar;)
Nol
6

Menurut manual ( man timeout):

Batas waktu sinopsis [OPSI] NUMBER [SUFFIX] PERINTAH [ARG] ...

[...] Jika perintah habis, maka keluar dengan status 124. Jika tidak, keluar dengan status PERINTAH

Gabungkan ini dengan pengetahuan bahwa status keluar atau nilai balik disimpan dalam variabel $?,, dan kami telah ...

timeout 5 /some/local/script/connect_script -x 'status' > output.txt
RETVAL=$?

Kemudian, Anda dapat melakukan lebih banyak pemrosesan berdasarkan nilai $RETVAL, yang akan menjadi 124 jika habis, atau nilai lain berdasarkan status keluar dari connect_script.

Christopher
sumber
1

Nilai pengembalian timeouttergantung pada sinyal yang Anda gunakan untuk mengakhiri anak.

SIGTERM pengembalian 124:

timeout -s SIGTERM 1 sleep 2; echo $?

Tetapi SIGKILLmengembalikan 137:

timeout -s SIGKILL 1 sleep 2; echo $?

Lihat halaman manual:

Jika perintah habis, dan --preserve-status tidak diatur, maka keluar dengan status 124. Jika tidak, keluar dengan status PERINTAH. Jika tidak ada sinyal yang ditentukan, kirim sinyal TERM setelah batas waktu. Sinyal TERM membunuh semua proses yang tidak menghalangi atau menangkap sinyal itu. Mungkin perlu menggunakan sinyal KILL (9), karena sinyal ini tidak dapat ditangkap, dalam hal ini status keluar adalah 128 + 9 daripada 124.

ceving
sumber