Katakanlah saya punya ini script.sh
#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
echo "Some other text"
#other commands here
sleep infinity
Saya ingin script.sh
menjalankan fungsi exit_script
setiap kali menerima SIGINT
atau SIGTERM
Misalnya:
killall script.sh # it will send SIGTERM to my script
dan saya ingin skrip saya menjalankan ini
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
Saya mencoba menerapkan fitur ini menggunakan trap
trap exit_script SIGINT SIGTERM
Orang yang menjawab pertanyaan saya membuktikan saya salah.
tetapi tidak berhasil karena trap
tampaknya hanya bereaksi terhadap sinyal yang dikirim ke proses anak / sub. Sebagai seorang pemula saya tidak bisa menguraikan trap
halaman manual jadi saya mungkin melewatkan solusinya.
Saya rasa itulah yang dilakukan program "nyata" seperti Chromium saat Anda mengirimnya SIGTERM
Dari https://major.io/2010/03/18/sigterm-vs-sigkill/
Aplikasi dapat menentukan apa yang ingin dilakukan setelah SIGTERM diterima. Sementara sebagian besar aplikasi akan membersihkan sumber daya mereka dan berhenti, beberapa mungkin tidak.
Jawaban:
trap
bereaksi terhadap sinyal proses panggilan itu sendiri. Tetapi Anda harus memanggilnya sebelum sinyal diterima. Maksud saya, di awal naskah Anda.Selain itu, jika Anda ingin menggunakan
kill -- -$$
, yang mengirimkan sinyal juga ke skrip Anda, Anda harus menghapus perangkap sebelum menjalankan kill atau Anda akan berakhir dengan loop kill && trap yang tak terbatas .Sebagai contoh:
Seperti dijelaskan dalam komentar, masalahnya adalah bahwa skrip menerima sinyal tetapi sedang menunggu program tidur untuk berakhir sebelum memproses sinyal yang diterima. Jadi, Anda harus membunuh proses anak (proses tidur dalam kasus ini) untuk menjalankan tindakan perangkap. Anda dapat melakukannya dengan sesuatu seperti berikut:
Atau seperti yang dinyatakan dalam komentar:
sumber
./script.sh & sleep 1 && kill -- -$(pgrep script.sh)
mengirim sinyal kill juga ke proses anak skrip Anda.