Latar Belakang:
Saya sedang menulis skrip uji untuk perangkat lunak biologi komputasi. Perangkat lunak yang saya uji dapat membutuhkan waktu berhari-hari atau bahkan berminggu-minggu untuk dijalankan, sehingga memiliki fungsi pemulihan bawaan, dalam kasus sistem crash atau listrik mati.
Saya mencoba mencari cara untuk menguji sistem pemulihan. Secara khusus, saya tidak dapat menemukan cara untuk "crash" program secara terkendali. Saya berpikir entah bagaimana mengatur waktu instruksi SIGKILL untuk dijalankan setelah beberapa waktu. Ini mungkin tidak ideal, karena test case tidak dijamin untuk menjalankan kecepatan yang sama setiap kali (ini berjalan di lingkungan bersama), jadi membandingkan log dengan output yang diinginkan akan sulit.
Perangkat lunak ini TIDAK mencetak garis untuk setiap bagian analisis yang dilengkapinya.
Pertanyaan:
Saya bertanya-tanya apakah ada cara yang baik / elegan (dalam skrip shell) untuk menangkap output dari suatu program dan kemudian membunuh program ketika baris / # garis yang diberikan dihasilkan oleh program?
Jawaban:
Skrip pembungkus seperti ini adalah pendekatan standar. Script menjalankan program di latar belakang dan kemudian loop, memeriksa file log setiap menit untuk beberapa string. Jika string ditemukan maka program latar belakang dimatikan dan skrip berhenti.
sumber
Jika program Anda akan berhenti pada SIGPIPE (yang merupakan tindakan default) itu harus cukup untuk menyalurkan output ke pembaca yang akan keluar saat membaca baris itu.
Jadi mungkin sesederhana itu
Jika Anda ingin menekan penggunaan output default
Demikian juga jika seseorang ingin berhenti setelah sejumlah garis tertentu seseorang dapat menggunakan head sebagai ganti sed, misalnya
Waktu yang tepat di mana membunuh terjadi tidak tergantung pada perilaku buffering dari terminal sebagai stardt menunjukkan di komentar.
sumber
sed
berakhir. OP mengatakan "Perangkat lunak ini TIDAK mencetak garis untuk setiap bagian analisis yang dilengkapinya". Ini mungkin berarti program akan menyelesaikan satu bagian tambahan! Bukti dari konsep:{ echo 1; sleep 3; >&2 echo peekaboo; sleep 3; echo 2; } | sed -e '/1/q'
. Lihat jawaban ini . Kemungkinan solusi:( program & ) | sed -e '/Suitable text from the line/q'; killall program
. Buat jawaban Anda sadar akan kekurangan dan saya akan mencabut downvote saya.Sebagai alternatif dari jawaban dmckee,
grep
perintah dengan-m
opsi (lihat misalnya halaman manual ini ) juga dapat digunakan:untuk berhenti ketika 1 baris yang cocok dengan teks ditemukan atau
untuk menunggu 10 baris yang tidak cocok dengan teks yang diberikan.
sumber
Anda dapat menggunakan
expect(1)
untuk menonton stdout program kemudian menjalankan tindakan yang telah ditentukan pada beberapa pola.Atau satu baris untuk menyematkan skrip lain:
Perhatikan bahwa
expect
perintah tidak datang dengan setiap OS secara default. Anda mungkin perlu menginstalnya.sumber
set timeout -1
untuk menetapkan batas waktu tidak terbatas, jika tidak semuanya akan ditutup di bawahexpect
batas waktu 10s default.Anda bisa menggunakan pernyataan "sementara":
Anda perlu menyalurkan output dari perangkat lunak Anda (atau log-nya) dan kemudian, untuk setiap baris baru, buat tes kondisional, kemudian jalankan kill -KILL. Sebagai contoh (Saya menguji dengan / var / log / messages sebagai file log):
Atau dengan perangkat lunak secara langsung:
Anda perlu mengubah jalur log / nama aplikasi, baris yang cocok dan PID untuk dibunuh (Anda juga dapat menggunakan killall).
Semoga berhasil dengan perangkat lunak Anda,
Hugo,
sumber