โปรแกรมปกติหลายตัวของฉันทำงานขัดข้อง (เป็นประจำ) พร้อมข้อความ "สัญญาณที่ผู้ใช้กำหนด 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"