(Nếu bạn chỉ có số của một tín hiệu và muốn tên, kill -l $SIGNAL_NUM
in tên của một tín hiệu, bạn có thể tránh điều đó bằng cách sử dụng các tên tín hiệu thay vì con số trong cuộc gọi của bạn để trap
như dưới đây.)
This answer nói rằng cách duy nhất để xác định tín hiệu nào bạn bị mắc kẹt trong bash là viết một trình bao bọc riêng cho từng tín hiệu khác nhau mà bạn muốn bẫy. Another answer on that same question cung cấp một chức năng bao bọc để làm điều đó cho bạn:
Code:
#!/bin/bash
trap_with_arg() {
func="$1" ; shift
for sig ; do
trap "$func $sig" "$sig"
done
}
func_trap() {
echo Trapped: $1
}
trap_with_arg func_trap INT TERM EXIT
read # Wait so the script doesn't exit.
Nếu tôi chạy đó, sau đó tôi có thể gửi tín hiệu đến quá trình này và tôi nhận được kết quả như
Trapped: INT
Trapped: TERM
Trapped: EXIT
Cảm ơn. Nhưng nó sẽ không làm việc cho tôi. Hàm trap_with_arg() sẽ chặn cho đến khi nhận được tín hiệu. Tôi muốn tên tín hiệu được hiển thị khi nhận được tín hiệu - trong khi kịch bản đang được thực hiện. Trong trường hợp của tôi, tôi không chờ đợi tín hiệu. Bất cứ khi nào nó đến, cần phải được in. –
'trap_with_arg()' không chặn. Nó lặp qua đầu vào của nó, thiết lập các trình xử lý bẫy và sau đó trả về. – perelman
Lunar Mushrooms, có vẻ như nó bị chặn vì bẫy không được xử lý trong khi các lệnh trong tập lệnh của bạn đang chạy. Nếu bạn báo hiệu kịch bản của bạn trong khi nó đang ở giữa một 'giấc ngủ', nó sẽ không thực hiện bẫy của bạn cho đến khi' ngủ' đã hoàn thành. Nó không phải là không đồng bộ. Bẫy sẽ bắt tín hiệu giữa các lệnh trong tập lệnh của bạn. – Ray