Ctrl-C di skrip bash


22

Bagaimana cara menerapkan ctrl+ cpenanganan dalam skrip bash sehingga skrip terputus, serta perintah yang saat ini berjalan diluncurkan oleh skrip?

(Bayangkan ada skrip yang menjalankan beberapa perintah yang sudah berjalan lama. Pengguna memukul ctrl+ cdan menyela perintah, tetapi skrip melanjutkan.) Saya perlu itu berperilaku dengan cara yang membuat mereka berdua terbunuh.


1
Jika OS Anda mengaktifkan kontrol-pekerjaan, opsi lain adalah menghentikan skrip itu (biasanya dengan crtl-z). Anda dapat melanjutkan pekerjaan itu di latar belakang dengan bg, membunuhnya atau melanjutkannya di latar depan fg. Lihat bagian manual bash JOB CONTROL.
ott--

Jawaban:


25

Anda melakukan ini dengan membuat subrutin yang ingin Anda panggil ketika SIGINT diterima, dan Anda harus menjalankannya trap 'subroutinename' INT.

Contoh:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
Perhatikan bahwa Anda juga dapat menjebak EXITdalam kasus di mana Anda memiliki sesuatu yang ingin Anda jalankan kapan saja skrip keluar terlepas bagaimana itu berhenti. ( KILLdikecualikan, tentu saja.)
Blrfl

Terima kasih banyak! Namun, ketika 'tidur' terbunuh - shell masih dapat mengatur untuk menjalankan perintah selanjutnya ketika rutin trap sedang berjalan: 'echo' dalam kasus ini ... atau saya salah?
kolypto

Itu seharusnya tidak mungkin, tidak. Itu tidak melakukan tugas secara paralel.
Kvisle
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.