Có cách nào để biết nếu một tập lệnh shell bị giết với tín hiệu 9 không


14

Tôi có một tập lệnh bash (được gọi từ một chương trình java) tiếp tục bị giết. Tôi luôn luôn bắt signal 15với trapnhưng sau đó một số tín hiệu khác đến cùng mà tôi nghi ngờ là signal 9nhưng đang ở cơ bản mù như nếu nó thực sự là signal 9.

Tôi biết bạn không thể trap signal 9, vậy có cách nào khác tôi có thể biết nếu signal 9đang giết kịch bản shell của mình không?


4
Điều gì đang chạy kịch bản shell? Quá trình đó nên có quyền truy cập vào statusquá trình con thông qua wait(2)hoặc một cái gì đó.
thrig

một chương trình java đang chạy như một daemon bắt đầu với upstart đang chạy tiến trình shell shell
jgr208

1
Bạn có thể sải bước chương trình và tìm kiếm một dòng có nội dung "bị giết bởi SIGKILL" hoặc thực hiện một số công việc kiểm toán với-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Câu trả lời:


20

Trạng thái thoát của lệnh bị giết phải là số tín hiệu cộng với 128. Vì vậy, bạn có thể sử dụng trạng thái thoát để tìm ra tín hiệu nào đã giết bạn xử lý.

Tôi đã thử nghiệm nó như thế này trên Linux trong shell:

print_exit_status_for_signal () {
  (
    sleep 1000
    echo Exit staus $? = signal $(( $? - 128 ))
  ) &
  sleep 1
  killall "${1:+-$1}" sleep
}
print_exit_status_for_signal
print_exit_status_for_signal 15
print_exit_status_for_signal 9
print_exit_status_for_signal KILL
print_exit_status_for_signal TERM

EDIT: Lưu ý rằng một chương trình có thể quyết định thoát với bất kỳ giá trị nào (vì vậy bạn phải quyết định mức độ tin cậy của trạng thái thoát là ảnh hưởng của tín hiệu):

for i in $(seq 256); do
  sh -c "exit $i"
  echo Program exited with $?
done

Chú thích 1: Trên các hệ thống của tôi, các mã thoát được biểu diễn dưới dạng các số 8 bit không dấu để chúng bao bọc ở mức 256 = 0.


1
Lưu ý rằng điều này chỉ đáng tin cậy cho tín hiệu 9 không thể bị mắc kẹt. Các tín hiệu khác có thể bị bẫy bởi chương trình có thể thoát với bất kỳ giá trị nào.
GnP

vâng, như gnp đã nói, giết -9 không thể bị đánh bẫy
c4f4t0r

Bạn có nguồn nào không?
Hai mươi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.