สัญญาณ 0 ในคำสั่ง Trap คืออะไร?


12

ฉันทำตามคำแนะนำนี้เกี่ยวกับวิธีการตั้งค่าการรับรองความถูกต้อง SSH แบบไม่มีรหัสผ่านกับ ssh-agent

ในการเริ่มต้น ssh-agent ผู้เขียนแนะนำรหัสต่อไปนี้ใน.bash_profile:

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

ฉันไม่เข้าใจว่าทำไมมันถึงเป็นกับดักสัญญาณ 0 ตามสัญญาณของมนุษย์ 7ไม่มีสัญญาณดังกล่าว

นี่เป็นเพียงการพิมพ์ผิดหรือข้อผิดพลาดหรือทำสิ่งนี้สำเร็จหรือไม่

คำตอบ:


19

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

trap [-lp] [[arg] sigspec ...]

... หาก sigspec เป็น EXIT (0) คำสั่ง arg จะถูกเรียกใช้งานเมื่อออกจากเชลล์


13
แก้ไข. ในกรณีที่ผู้อ่านมาที่นี่เพราะชื่อคำถามให้สังเกตว่านี่เป็นความหมายของคำสั่ง0เชลล์ trapเมื่อส่งสัญญาณด้วยkillหมายเลขสัญญาณ 0 หมายถึงไม่ส่งสัญญาณหลังจากทั้งหมด นี่เป็นวิธีการทดสอบการมีอยู่ของกระบวนการเป้าหมาย
Gilles 'หยุดชั่วร้าย'

@ Mat: ขอบคุณมาก ฉันอ่านคน 1 คนกับดัก ...
Christoph Wurm

1
แต่มันไม่ได้อยู่ในรายการผลลัพธ์โดยtrap -l!
แอมเฟตามาจิน

คุณช่วยกรุณาจัดการกับกรณีเมื่อสคริปต์มีที่มา?
Eric

1

ตามที่ @Mat แสดงในคำตอบของเขา SIGSPEC เป็น 0 เมื่อใช้กับtrapคำสั่งจะทำให้trapคำสั่งทำงานเมื่อสคริปต์ออก

ตัวอย่างนี้แสดงให้เห็นถึงสิ่งที่เกิดขึ้น

$ cat tr.bash 
#!/bin/bash

echo "PID: $$"

trap 'echo hi; exit 1' 0 1 2 15

while [ 1 ]; do
    sleep 3
done

เมื่อเรารันสิ่งนี้:

$ ./tr.bash 
PID: 24086

นั่งอยู่ที่นี่รออย่างไม่มีกำหนด ในหน้าต่างอื่นถ้าตอนนี้เราส่งkillสัญญาณไปคุณจะเห็นว่า a kill -0จะไม่ฆ่ากระบวนการแม้ว่าสัญญาณ 0 จะแสดงรายการในtrapคำสั่ง

$ kill -0 $(pgrep tr.bash)
$

อย่างไรก็ตามถ้าเราkillใช้สคริปต์สัญญาณ 1 kill -1:

$ kill -1 $(pgrep tr.bash)
$

เราจะเห็นว่าสคริปต์ออกและพิมพ์ข้อความ "hi" 2 ครั้ง สัญญาณแรกสำหรับสัญญาณที่ 1 และที่สองเนื่องจากสคริปต์ออก

$ ./tr.bash 
PID: 24086
hi
hi

0

trap on 0 ถูกรันเมื่อเชลล์ออก โดยทั่วไปจะใช้เพื่อล้างไฟล์ tmp ในที่เดียวที่ถูกเรียกใช้งานเสมอ:

tmp = / tmp / MyScript. $$

กับดัก 'rm -f $ tmp; ออก '0 1 2 15

do_a_bunch_of_stuff

ทางออก

ทางออกที่ส่วนท้ายของกับดักออกจากเชลล์ที่การล้างข้อมูลด้วยสถานะที่ถูกต้อง

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