สคริปต์ Bash ไม่เห็น SIGHUP ใช่ไหม


11

ฉันมีสคริปต์ต่อไปนี้:

#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat    # wait indefinitely

เมื่อฉันส่งSIGHUP(ใช้kill -HUP pid) ไม่มีอะไรเกิดขึ้น

ถ้าฉันเปลี่ยนสคริปต์เล็กน้อย:

#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT    # add this
trap "echo HUP" SIGHUP
cat    # wait indefinitely

... จากนั้นสคริปต์ก็ทำecho HUPสิ่งที่ถูกต้องทันทีที่ออก (เมื่อฉันกด Ctrl + C):

roger@roger-pc:~ $ ./hupper.sh 
We are 6233
^CHUP

เกิดอะไรขึ้น? ฉันจะส่งสัญญาณ (ไม่จำเป็นต้องมีSIGHUP) ไปยังสคริปต์นี้ได้อย่างไร


4
สัญญาณจะถูกส่งและตัวจัดการสัญญาณจะดำเนินการเมื่อcatกระบวนการเสร็จสิ้น ลองใช้สคริปต์ต้นฉบับของคุณแล้วกดCtrl+Dเพื่อทำให้catกระบวนการหยุดทำงาน ขณะที่catกระบวนการอยู่เบื้องหน้าHUPสัญญาณจะไม่ทำงาน ลองใหม่อีกครั้งโดยcatแทนที่ด้วยread(เชลล์ในตัว)
Kusalananda

สมบูรณ์ มีคนคิดเปลี่ยนเป็นคำตอบหรือไม่?
Roger Lipscombe

ฉันรู้ว่ามันใช้งานได้ แต่ฉันจะให้คนที่มีความเข้าใจลึกซึ้งยิ่งกว่าฉันไปยังคำพูดของคนอื่นและคำตอบก็คือ
Kusalananda

ฉันใช้while true; do read; doneในท้ายที่สุดมิฉะนั้นการป้อนข้อความทำให้เลิกเช่นกันและฉันต้องการให้เลิกกับ Ctrl + C
Roger Lipscombe

คำตอบ:


21

คู่มือการทุบตี :

หาก bash กำลังรอให้คำสั่งดำเนินการจนเสร็จสิ้นและรับสัญญาณที่ตั้งค่ากับดักไว้กับดักจะไม่ถูกดำเนินการจนกว่าคำสั่งจะเสร็จสิ้น

ซึ่งหมายความว่าแม้จะได้รับสัญญาณbashเมื่อคุณส่งมันกับดักของคุณใน SIGHUP จะถูกเรียกเมื่อcatจบเท่านั้น

หากพฤติกรรมนี้ไม่เป็นที่พึงปรารถนาให้ใช้bashbuiltins (เช่นread+ printfในวงวนแทนcat) หรือใช้งานพื้นหลัง (ดูคำตอบของStéphane )


9

@xhienne ได้อธิบายแล้วว่าทำไมแต่หากคุณต้องการให้สัญญาณทำงานได้ทันที (และไม่ออกจากสคริปต์) คุณสามารถเปลี่ยนรหัสของคุณเป็น:

#! /bin/bash -
interrupted=true
trap 'interrupted=true; echo HUP' HUP

{ cat <&3 3<&- & pid=$!; } 3<&0

while
  wait "$pid"
  ret=$?
  "$interrupted"
do
  interrupted=false
done
exit "$ret"

การเต้นรำเล็ก ๆ น้อย ๆ พร้อมกับตัวอธิบายไฟล์คือการหลีกbashเลี่ยงข้อเท็จจริงที่เปลี่ยนเส้นทาง stdin ไปยัง/dev/nullสำหรับคำสั่งที่เปิดใช้ในพื้นหลัง


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