คำถามติดแท็ก signals

สัญญาณคือข้อความที่สามารถส่งไปยังกระบวนการที่กำลังทำงานอยู่ สัญญาณสามารถเริ่มต้นได้โดยโปรแกรมผู้ใช้หรือผู้ดูแลระบบ

3
สัญญาณทำงานอย่างไรภายใน
โดยทั่วไปจะฆ่ากระบวนการที่เราสร้างสัญญาณเช่นSIGKILL, SIGTSTPฯลฯ แต่จะทราบได้อย่างไรว่าใครสั่งให้สัญญาณนั้นใครส่งไปยังกระบวนการเฉพาะและโดยทั่วไปสัญญาณทำงานอย่างไร สัญญาณภายในทำงานอย่างไร

4
วัตถุประสงค์ของการระงับที่ล่าช้า (Ctrl-Y) ใน Bash คืออะไร?
ส่วนเต็มของหน้า Bash man ซึ่งมีผลบังคับใช้จะบอกว่า: หากระบบปฏิบัติการที่ใช้ bash รองรับการควบคุมงาน bash จะมีระบบอำนวยความสะดวกในการใช้งาน การพิมพ์อักขระ suspend (โดยทั่วไปคือ ^ Z, Control-Z) ในขณะที่กระบวนการกำลังทำงานอยู่ทำให้กระบวนการนั้นหยุดลงและส่งกลับการควบคุมไปยัง bash การพิมพ์อักขระหยุดทำงานล่าช้า (โดยทั่วไปคือ ^ Y, Control-Y) ทำให้กระบวนการหยุดทำงานเมื่อพยายามอ่านอินพุตจากเทอร์มินัลและการควบคุมจะถูกส่งกลับไปยังทุบตี ผู้ใช้อาจจัดการกับสถานะของงานนี้โดยใช้bg คำสั่งเพื่อดำเนินการต่อในพื้นหลังfgคำสั่งเพื่อดำเนินการต่อในเบื้องหน้าหรือคำสั่ง kill เพื่อฆ่ามัน A ^ Z มีผลบังคับใช้ทันทีและมีผลข้างเคียงเพิ่มเติมที่ทำให้การส่งออกและประเภทหัวพิมพ์ที่รอดำเนินการถูกยกเลิก ฉันไม่เคยใช้Ctrl- Y; ฉันเพิ่งเรียนรู้เกี่ยวกับมัน ฉันทำได้ดีกับCtrl- Z(ระงับ) เท่านั้น ฉันพยายามจินตนาการว่าตัวเลือกนี้มีไว้เพื่ออะไร มันจะมีประโยชน์เมื่อไหร่? (โปรดทราบว่าคุณลักษณะนี้ไม่มีอยู่ในรุ่น Unix ทั้งหมดมีอยู่ในSolarisและFreeBSDแต่ไม่ใช่ใน Linux การตั้งค่าที่สอดคล้องกันคือstty dsusp) บางทีอาจจะน้อยจิตใจ: มีอะไรที่สามารถทำได้ด้วยCtrl- Yที่ไม่สามารถทำได้อย่างง่ายดายเพียงแค่มีCtrl- Z?


2
การขัดจังหวะของการโทรของระบบเมื่อจับสัญญาณ
จากการอ่าน man page บนread()และการwrite()โทรปรากฏว่าการโทรเหล่านี้ถูกขัดจังหวะด้วยสัญญาณโดยไม่คำนึงว่าพวกเขาจะต้องปิดกั้นหรือไม่ โดยเฉพาะสมมติว่า กระบวนการสร้างตัวจัดการสำหรับสัญญาณบางอย่าง อุปกรณ์ถูกเปิด (พูดเทอร์มินัล) โดยที่O_NONBLOCK ไม่ได้ตั้งค่า (เช่นทำงานในโหมดบล็อก) กระบวนการนี้ทำให้การread()เรียกระบบอ่านจากอุปกรณ์และผลลัพธ์จะดำเนินการพา ธ ควบคุมเคอร์เนลในเคอร์เนลพื้นที่ ในขณะที่กระบวนการดำเนินการอยู่read()ใน kernel-space สัญญาณที่ติดตั้งตัวจัดการไว้ก่อนหน้านี้จะถูกส่งไปยังกระบวนการนั้นและตัวจัดการสัญญาณถูกเรียกใช้ การอ่าน man man และส่วนที่เหมาะสมในSUSv3 'System Interfaces volume (XSH)' , หนึ่งพบว่า: ผม. หาก a read()ถูกขัดจังหวะโดยสัญญาณก่อนที่จะอ่านข้อมูลใด ๆ (นั่นคือต้องปิดกั้นเพราะไม่มีข้อมูล) จะส่งกลับ -1 ด้วยการerrnoตั้งค่าเป็น [EINTR] ii หาก a read()ถูกขัดจังหวะโดยสัญญาณหลังจากอ่านข้อมูลเรียบร้อยแล้ว (เช่นเป็นไปได้ที่จะเริ่มให้บริการตามคำขอทันที) มันจะส่งคืนจำนวนไบต์ที่อ่าน คำถาม A): ฉันถูกต้องหรือไม่ที่จะสมมติว่าในกรณีใด ๆ (บล็อก / ไม่มีบล็อก) …

1
systemd อยู่รอดการฆ่า -9 ได้อย่างไร?
ระหว่างคำถาม "ทำไม 'kill -9 0' ถึงจบเซสชันคอนโซลของฉัน" และ "วิธีการทำให้เคอร์เนลตื่นตระหนก" ฉันได้รับความรำคาญภายใต้อานของฉันและลองkill -9 1ใช้แล็ปท็อป Arch linux ที่ทันสมัยเป็นส่วนใหญ่ ฉันทำมันเป็น ID ผู้ใช้ "รูท" ฉันคาดหวังว่าจะเกิดความผิดพลาดหรือตื่นตระหนกหรือปิดเครื่อง แต่ก็ไม่มีอะไรเกิดขึ้น ฉันทำkill -9 1อีกครั้งไม่มีผล เครื่อง Arch Linux ใช้งานsystemdวันนี้ดังนั้น: systemdเอาตัวรอด kill -9 ได้อย่างไร ฉันคาดหวังว่าจะมีรหัสกรณีพิเศษในเคอร์เนล Linux 3.7 แต่อาจมีสาเหตุอื่นที่ฉันไม่ได้คิด สิ่งอื่น ๆ ที่ทำงานด้วย PID 1 คืออะไร Slackware ยังคงใช้initฉันเชื่อ แต่ฉันกลัวที่จะลองบนเซิร์ฟเวอร์ Slackware ที่ใช้งานจริงของฉัน DD-WRT บนเราเตอร์ไร้สายของฉันรัน / sbin …

2
อะไรเป็นสาเหตุให้มีการส่งสัญญาณต่าง ๆ
บางครั้งฉันก็สับสนเล็กน้อยจากสัญญาณทั้งหมดที่กระบวนการสามารถรับได้ ขณะที่ผมเข้าใจว่ามันเป็นกระบวนการที่มีการดำเนินการเริ่มต้น ( สัญญาณจำหน่าย ) สำหรับแต่ละสัญญาณเหล่านี้ sigaction()แต่ก็สามารถให้การจัดการของตัวเองโดยการเรียก ดังนั้นนี่คือคำถามของฉันสิ่งที่ทำให้แต่ละสัญญาณจะถูกส่ง? ฉันรู้ว่าคุณสามารถส่งสัญญาณไปยังกระบวนการที่ทำงานผ่าน-sพารามิเตอร์ด้วยตนเองได้killแต่สิ่งที่เป็นธรรมชาติภายใต้สัญญาณเหล่านี้จะถูกส่งไป? ตัวอย่างเช่นเมื่อไหร่จะSIGINTได้รับการส่ง? นอกจากนี้ยังมีข้อ จำกัด ใด ๆ ที่สามารถจัดการสัญญาณได้หรือไม่? สามารถSIGSEGVประมวลผลสัญญาณและควบคุมการส่งคืนแอปพลิเคชันได้หรือไม่
28 process  signals 

2
ฉันจะฆ่ากระบวนการ <defunct> ที่ parent เป็นผู้เริ่มต้นได้อย่างไร
การส่งกำลังแขวนอยู่บน NAS ของฉันเป็นระยะ ถ้าฉันส่ง SIGTERM มันจะไม่หายไปจากรายการกระบวนการและ&lt;defunct&gt;ฉลากจะปรากฏขึ้นถัดจากมัน ถ้าผมส่ง SIGKILL initก็ยังคงไม่ได้หายไปและผมก็ไม่สามารถยุติแม่เพราะแม่เป็น วิธีเดียวที่ฉันสามารถกำจัดกระบวนการและรีสตาร์ทเกียร์คือการรีบูต ฉันตระหนักถึงสิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือลองและแก้ไขการส่งข้อมูล (และฉันพยายามแล้ว) แต่ฉันเป็นผู้เริ่มต้นในการรวบรวมและฉันต้องการให้แน่ใจว่า torrents ของฉันเสร็จสิ้นก่อนที่ฉันจะเริ่มยุ่งกับมัน

1
ctrl c เทียบกับ ctrl z ด้วยเบื้องหน้างาน
Ctrl+ Zหยุดงานขณะที่Ctrl+ Cฆ่างาน ทำไมถึงเป็นอย่างนั้น? วิธีอื่นจะไม่เข้าท่ามากกว่านี้หรือ z@z-lap:~$ sleep 100&amp; [1] 4458 z@z-lap:~$ sleep 200&amp; [2] 4459 z@z-lap:~$ jobs [1]- Running sleep 100 &amp; [2]+ Running sleep 200 &amp; z@z-lap:~$ fg %1 sleep 100 ^Z [1]+ Stopped sleep 100 z@z-lap:~$ jobs [1]+ Stopped sleep 100 [2]- Running sleep 200 &amp; z@z-lap:~$ fg …

2
เมื่อคุณพยายามที่จะยุติกระบวนการที่ดีคุณควรใช้ตัวเลือก“ ฆ่า” แบบใด?
ฉันได้รับข้อความมากมายจากผู้คนและสงสัยว่าจริงๆแล้วมันมีความแตกต่างไม่มากในสิ่งที่คุณใช้ kill 'x' killall 'x' kill -9 'x' นี่คือตัวเลือกบางอย่างที่ฉันได้รับคำสั่งให้ใช้จนถึงตอนนี้ แต่บางคนบอกว่า kill -9 เป็นเพียง overkill การฆ่าด้วยตัวเองไม่ทำงาน ฯลฯ ใครบ้างมีคำแนะนำใด ๆ ที่ควรใช้ในกรณีมาตรฐานมากที่สุดเพียงแค่ยกเลิกกระบวนการ (และทำให้สถานะของมันเช่นกัน)? [แก้ไข] ฉันกำลังมองหาสิ่งที่จะใช้เมื่อคุณต้องการที่จะหยุดการดำเนินการของกระบวนการของคุณเพื่อให้คุณสามารถเรียกใช้ใหม่สดจากจุดเริ่มต้น
26 process  kill  signals 

2
เหตุใดฉันจึงไม่สามารถฆ่ากระบวนการ SIGSTOP ด้วย SIGTERM และสัญญาณที่ค้างอยู่ถูกเก็บไว้ที่ไหน
ฉันกำลังใช้ Debian stretch (systemd) ฉันใช้ rsyslog daemon ในโหมดเบื้องหน้าโดยใช้ /usr/sbin/rsyslogd -n และฉันได้Ctrl+ Zเพื่อหยุดมัน สถานะของกระบวนการเปลี่ยนเป็นTl(หยุดทำงาน, เธรด) ฉันออกคำสั่งหลายคำสั่งให้กับกระบวนการและสถานะของกระบวนการเหมือนกัน: . เมื่อฉันทำมันก็ตาย ฉันมี 3 คำถามkill -15 &lt;pid&gt;Tlfg ทำไมเป็นSIGSTOPกระบวนการ -ed ไม่ตอบสนองต่อSIGTERM? ทำไมเคอร์เนลจึงเก็บมันไว้ในสถานะเดียวกัน ทำไมมันถึงถูกฆ่าทันทีที่ได้รับSIGCONTสัญญาณ หากเป็นเพราะSIGTERMสัญญาณก่อนหน้านี้จะถูกเก็บไว้ที่ไหนจนกว่ากระบวนการจะกลับมาทำงานต่อ
24 process  kill  signals 

2
วิธีการยุติแบบระยะไกลเรียกว่า“ tail -f” เมื่อการเชื่อมต่อถูกปิด
ฉันเพิ่งสังเกตเห็นว่าถ้าฉันรันssh user@remote_host tail -f /some/fileแล้วtail -f /some/fileยังคงทำงานบน remote_host แม้ว่าการเชื่อมต่อ ssh ถูกปิด! ดังนั้นหลังจากหลายการเชื่อมต่อและยกเลิกการเชื่อมต่อจำนวนการทำงานtail -f /some/fileจะเพิ่มขึ้น วิธีการยุติจริงtail -fเมื่อการเชื่อมต่อ ssh ถูกปิด?

5
วิธีทำให้ `xargs 'ไม่สนใจการออกจากเด็กและดำเนินการต่อไป
บางครั้งฉันทำงานนานมากในxargsชั่วข้ามคืนและมันน่ารำคาญจริง ๆ ที่ค้นพบในตอนเช้าที่xargsเสียชีวิตตรงกลางตัวอย่างเช่นเกิดจากความผิดพลาดในการแบ่งเซ็กเมนต์ในกรณีพิเศษหนึ่งกรณีเช่นเดียวกับที่เกิดขึ้นในคืนนี้ หากแม้กระทั่งxargsเด็กหนึ่งคนถูกฆ่าก็จะไม่ดำเนินการอินพุตอีกต่อไป: คอนโซล 1: [09:35:48] % seq 40 | xargs -i --max-procs=4 bash -c 'sleep 10; date +"%H:%M:%S {}";' xargs: bash: terminated by signal 15 09:35:58 3 09:35:58 4 09:35:58 2 &lt;Exit with code 125&gt; คอนโซล 2: [09:35:54] kill 5601 ฉันสามารถป้องกันไม่ให้xargsหยุดเพื่อประมวลผลอินพุตอีกต่อไปเมื่อกระบวนการลูกตายและดำเนินการแทนต่อไปได้หรือไม่?
24 kill  xargs  signals 

2
เหตุใดการพิมพ์ Ctrl + c สองครั้งจึงหยุดกระบวนการทำงานใน Linux
มีโปรแกรม Linux เช่น vlc ที่แนะนำให้พิมพ์ctrl+ cสองครั้งเพื่อฆ่าการเรียกใช้งานจากเทอร์มินัลหากโปรแกรมไม่หยุดทำงานหลังจากโปรแกรมแรก เหตุใดการพิมพ์ctrl+ cสองครั้งจึงทำงานไม่ได้ในครั้งแรก
24 kill  signals 

2
ระบบจะส่ง SIGTERM ไปยังกระบวนการเมื่อใด
โปรแกรมเซิร์ฟเวอร์ของฉันได้รับ SIGTERM และหยุดทำงาน (ด้วยรหัสออก 0) ฉันประหลาดใจกับสิ่งนี้เนื่องจากฉันค่อนข้างมั่นใจว่ามีหน่วยความจำมากมายสำหรับมัน linux (busybox) ส่ง SIGTERM ไปยังกระบวนการใดภายใต้เงื่อนไขใด

5
ฉันจะฆ่าและรอให้กระบวนการส่วนหลังเสร็จสิ้นในเชลล์สคริปต์ได้อย่างไรเมื่อฉัน Ctrl + C
ฉันกำลังพยายามตั้งค่าเชลล์สคริปต์เพื่อให้ทำงานในกระบวนการแบ็คกราวน์และเมื่อฉันCtrlcเชลล์สคริปมันจะฆ่าเด็ก ๆ แล้วก็ออกไป สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ ดูเหมือนว่าkill 0 -INTสคริปต์ยังฆ่าสคริปต์ก่อนที่จะเกิดการรอดังนั้นเชลล์สคริปต์จะตายก่อนที่เด็ก ๆ จะเสร็จสมบูรณ์ ความคิดใด ๆ เกี่ยวกับวิธีการที่ฉันสามารถทำให้รอเชลล์สคริปต์สำหรับเด็กที่จะตายหลังจากที่ส่งINT? #!/bin/bash trap 'killall' INT killall() { echo "**** Shutting down... ****" kill 0 -INT wait # Why doesn't this wait?? echo DONE } process1 &amp; process2 &amp; process3 &amp; cat # wait forever

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