มีวิธีใดที่จะบอกได้ว่าเชลล์สคริปต์ถูกฆ่าด้วยสัญญาณ 9


14

ฉันมีสคริปต์ทุบตี (เรียกจากโปรแกรมจาวา) ที่ยังคงถูกฆ่า ฉันมักจะจับsignal 15ด้วยtrapแต่แล้วบางส่วนสัญญาณอื่น ๆ ที่มาพร้อมที่ฉันสงสัยว่าเป็นแต่ฉันในพื้นตาบอดเป็นไปได้ถ้ามันเป็นจริงsignal 9signal 9

ฉันรู้ว่าคุณไม่สามารถtrap signal 9มีวิธีอื่นที่ฉันสามารถบอกได้ว่าsignal 9กำลังฆ่าเชลล์สคริปต์ของฉันหรือไม่


4
เชลล์สคริปต์ทำงานอะไร กระบวนการนั้นควรมีการเข้าถึงstatusกระบวนการลูกผ่านwait(2)หรือบางสิ่งบางอย่าง
thrig

โปรแกรมจาวาที่ทำงานเป็น daemon ที่เริ่มต้นด้วย upstart กำลังทำงานกระบวนการเชลล์สคริปต์
jgr208

1
คุณสามารถ strace โปรแกรมและค้นหาบรรทัดที่เขียนว่า "ถูกฆ่าโดย SIGKILL" หรือทำงานกับ auditd บางคน-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

คำตอบ:


20

สถานะทางออกของคำสั่ง kill ควรเป็นหมายเลขสัญญาณบวก 128 ดังนั้นคุณสามารถใช้สถานะทางออกเพื่อค้นหาว่าสัญญาณใดที่คุณฆ่าซึ่งประมวลผล

ฉันทดสอบมันเช่นนี้ใน Linux ในเปลือก:

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

แก้ไข: โปรดทราบว่าโปรแกรมสามารถตัดสินใจที่จะออกด้วยค่าใด ๆ (ดังนั้นคุณต้องตัดสินใจว่าคุณไว้วางใจสถานะการออกเพื่อให้ได้ผลของสัญญาณมากแค่ไหน):

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

เชิงอรรถ 1: ในรหัสทางออกของระบบของฉันจะแสดงเป็นตัวเลข 8 บิตที่ไม่ได้ลงชื่อดังนั้นจึงห่อที่ 256 = 0


1
โปรดทราบว่านี่น่าเชื่อถือสำหรับสัญญาณ 9 เท่านั้นซึ่งไม่สามารถดักจับได้ สัญญาณอื่น ๆ สามารถถูกดักจับโดยโปรแกรมซึ่งสามารถออกได้ด้วยค่าใด ๆ
GnP

ใช่ตามที่ gnp บอกการสังหาร -9 นั้นไม่สามารถดักจับได้
c4f4t0r

คุณมีแหล่งที่มาหรือไม่?
Twifty
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.