โปรแกรมปกติหลายตัวของฉันทำงานขัดข้อง (เป็นประจำ) พร้อมข้อความ "สัญญาณที่ผู้ใช้กำหนด 1" ฉันรู้ว่ามีnohupคำสั่ง แต่มีnousr1คำสั่งหรือไม่ หรือสิ่งที่จะทำอะไรเช่นnohupแต่กับ USR1?
โปรแกรมปกติหลายตัวของฉันทำงานขัดข้อง (เป็นประจำ) พร้อมข้อความ "สัญญาณที่ผู้ใช้กำหนด 1" ฉันรู้ว่ามีnohupคำสั่ง แต่มีnousr1คำสั่งหรือไม่ หรือสิ่งที่จะทำอะไรเช่นnohupแต่กับ USR1?
คำตอบ:
วิธีแฮ็กที่เรียบง่ายที่มียูทิลิตี้คล้ายกับnohupแต่สำหรับSIGUSR1จะได้รับสำเนาของคอร์ที่เป็นแหล่งcoreutilsแกะมันทำ
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
หรือไม่ก็เลือกเปลี่ยนชื่อไฟล์เอาต์พุต
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
คอมไพล์ซอร์สนี้และติดตั้งnohupไบนารีที่คอมไพล์ใหม่เพื่อ/usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
หลังจากนี้เมื่อฉันตรวจสอบให้sleep 1000ออกในUSR1ขณะที่nousr1 sleep 1000ภูมิคุ้มกันสัญญาณนี้
nohupการใช้งานคือการยกเลิกการเชื่อมโยงกระบวนการจากเทอร์มินัลดังนั้นจึงไม่ได้ส่งมาSIGHUPตั้งแต่แรก ว่ามันยังตั้งตัวจัดการสัญญาณเป็นโบนัสเพิ่มเติม แต่ไม่จำเป็น
signal(SIGHUP,SIG_IGN);การโทรในกระบวนการที่จะได้รับnohup.c SIGHUPสิ่งที่nohupนอกเหนือจากการเพิกเฉยสัญญาณเป็นเพียงการเปิด stdin, stdout, stderr descriptors อีกครั้งเป็นไฟล์ที่ไม่ใช่เทอร์มินัล มันไม่ได้ยกเลิกการเชื่อมโยงกระบวนการจากเทอร์มินัลด้วยวิธีพิเศษใด ๆ นั่นคือกระบวนการจะถูกส่งSIGHUPเมื่อสถานีวางสาย ในอีกด้านหนึ่งมีทุบตีซึ่งทำสิ่งที่คล้ายกันกับdisownคำสั่ง แต่ฉันไม่แน่ใจว่ามันจะถูกนำไปใช้อย่างไร - อาจเป็นในแบบที่คุณหมายถึง
คุณต้องใช้รูปแบบของtrapคำสั่งด้วยอาร์กิวเมนต์ว่าง ลองสิ่งนี้:
trap '' SIGUSR1; myprogram
สิ่งนี้จะไม่สนใจสัญญาณ SIGUSR1 ซึ่งเป็นสิ่งที่คุณพยายามทำ แม้ว่าฉันจะเห็นด้วยกับผู้แสดงความคิดเห็นว่าอาจจะเกิดขึ้นที่นี่มากกว่าตรงตา
แบบฟอร์มไม่ถูกต้อง:
trap 'echo ...' SIGUSR1; myprogram
จะยังคงอนุญาตให้myprogramรับ SIGUSR1 แต่เชลล์จะดำเนินechoการtrapคำสั่งจาก
trap '' SIGUSR1; gvimdiff file1 file2แล้ว Vim ก็ตายด้วย "Vim: จับสัญญาณมฤตยู USR1"