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

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

3
การเริ่มต้น Apache เป็นบริการที่เลิกกับ SIGWINCH
เมื่อทำงานservice apache startฉันเห็นในล็อกไฟล์รายการนี้: [mpm_event:notice] [pid 1906:tid XXX] AH00489: Apache/2.4.23 (Unix) OpenSSL/1.0.2g PHP/7.0.9 configured -- resuming normal operations [core:notice] [pid 1906:tid XXX] AH00094: Command line: '/usr/sbin/httpd' [mpm_event:notice] [pid 1906:tid XXX] AH00492: caught SIGWINCH, shutting down gracefully และบริการapacheไม่เริ่มทำงาน ฉันสามารถหาได้จากอินเทอร์เน็ตในความSIGWINCHหมายของ [ Window size change] แต่มันไม่ได้ช่วยฉันในกรณีนี้ ไฟล์/etc/systemd/system/apache.service: [Unit] Description=The Apache Webserver [FaF Compiled] After=network.target …

2
ทำไมซอมบี้จึงกำลังรอลูกอยู่
ฉันกำลังขุดผ่านแหล่งต่าง ๆ แต่ไม่สามารถหาคำอธิบายที่ดีเกี่ยวกับกายวิภาคของการเลี้ยงเด็กได้ นี่เป็นกรณีง่าย ๆ ของสิ่งที่ฉันต้องการจะเข้าใจ $ cat <( sleep 100 & wait ) & [1] 14247 $ ps ax -O pgid | grep $$ 12126 12126 S pts/17 00:00:00 bash 14248 12126 S pts/17 00:00:00 bash 14249 12126 S pts/17 00:00:00 sleep 100 14251 14250 S pts/17 00:00:00 grep …

2
stderr มากกว่า ssh -t
สิ่งนี้จะส่งเอาต์พุตไปยัง STDERR แต่ไม่แพร่กระจายCtrl+ C(เช่นCtrl+ Cจะฆ่าsshแต่ไม่ใช่รีโมตsleep): $ ssh localhost 'sleep 100;echo foo ">&2"' สิ่งนี้แพร่กระจายCtrl+ C(เช่นCtrl+ Cจะฆ่าsshและห่างไกลsleep) แต่ส่ง STDERR ไปยัง STDOUT: $ ssh -tt localhost 'sleep 100;echo foo ">&2"' ฉันจะบังคับให้วินาทีส่งเอาต์พุต STDERR ไปยัง STDERR ในขณะที่ยังคงแพร่กระจายCtrl+ ได้Cอย่างไร พื้นหลัง GNU ใช้ขนาน 'SSH -tt' เพื่อเผยแพร่+Ctrl Cสิ่งนี้ทำให้สามารถฆ่างานที่กำลังรันอยู่ในระยะไกลได้ แต่ข้อมูลที่ส่งไปยัง STDERR ควรไปยัง STDERR ต่อไปเมื่อสิ้นสุดการรับ

4
เหตุใดฉันจึงไม่สามารถฆ่าการหมดเวลาที่เรียกจากสคริปต์ Bash ด้วยการกดแป้นได้
[แก้ไข: นี่คล้ายกับคำถามอื่น ๆ ที่ถามว่าจะฆ่ากระบวนการที่เกิดมาทั้งหมดได้อย่างไร - คำตอบทั้งหมดดูเหมือนจะใช้ pkill ดังนั้นหลักของคำถามของฉันอาจเป็น: มีวิธีการเผยแพร่ Ctrl-C / Z ไปยังกระบวนการทั้งหมดที่เกิดจากสคริปต์หรือไม่?] เมื่อเรียกใช้ SoX recด้วยtimeoutคำสั่งจาก coreutils (กล่าวถึงที่นี่ ) ดูเหมือนจะไม่มีทางที่จะฆ่ามันด้วยการกดแป้นเมื่อมีการเรียกใช้จากภายในสคริปต์ Bash ตัวอย่าง: timeout 10 rec test.wav ... สามารถถูกฆ่าด้วยCtrl+ CหรือCtrl+ Zจากการทุบตี แต่ไม่ใช่เมื่อมันถูกเรียกจากภายในสคริปต์ timeout 10 ping nowhere ... สามารถถูกฆ่าด้วยCtrl+ CหรือCtrl+ Zจาก bash และด้วยCtrl+ Zเมื่อมันถูกเรียกใช้จากภายในสคริปต์ ฉันสามารถค้นหารหัสกระบวนการและฆ่าด้วยวิธีนั้น แต่ทำไมฉันไม่สามารถใช้การกดแป้นพิมพ์มาตรฐาน และมีวิธีการจัดโครงสร้างสคริปต์ของฉันเพื่อให้ฉันสามารถ?

2
ทำไมมีสัญญาณที่ผู้ใช้กำหนดเพียงสองสัญญาณเท่านั้น
ในรายการสัญญาณที่กำหนดไว้ในระบบ linux มีสัญญาณสองสัญญาณที่ระบุว่าสัญญาณที่ผู้ใช้กำหนด ( SIGUSR1และSIGUSR2) สัญญาณอื่น ๆ จะถูกยกหรือจับในสถานการณ์ที่เฉพาะเจาะจง แต่ SIGUSR จะถูกทิ้งไว้เพื่อการใช้งานของผู้ใช้ เหตุใดจึงมีเพียงสองสัญญาณ
11 history  signals  ipc 

2
สคริปต์ Bash ไม่เห็น SIGHUP ใช่ไหม
ฉันมีสคริปต์ต่อไปนี้: #!/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 …
11 bash  signals 

2
เหตุใดขณะหนึ่งลูปจึงหยุดหลังจากถูกระงับ
ทำไมการใช้ bash และหยุดชั่วขณะหนึ่งวงจึงหยุดลงหลังจากกลับมาทำงานต่อ ตัวอย่างสั้น ๆ ด้านล่าง $ while true; do echo .; sleep 1; done . . ^Z [1]+ Stopped sleep 1 $ fg sleep 1 $ ฉันคุ้นเคยกับสัญญาณและฉันเดาว่านี่อาจเป็นพฤติกรรมตามธรรมชาติของการทุบตีที่นี่ แต่ฉันต้องการที่จะเข้าใจมากขึ้นว่าทำไมมันทำงานในลักษณะนี้โดยเฉพาะ

1
ในกรณีใดที่ SIGHUP ไม่ส่งงานเมื่อคุณออกจากระบบ?
ฉันอ่านคำตอบจากผู้ใช้ที่อ้างว่าใช้งานได้ foo 2>&1 >& output.log & จะส่งผลfooให้ทำงานต่อไปแม้ในขณะที่ออกจากระบบ ตามที่ผู้ใช้คนนี้ทำงานได้ดีกว่าการเชื่อมต่อ SSH ฉันไม่เชื่อจริง ๆ เพราะฉันรู้สึกว่าในกรณีที่ตัดการเชื่อมต่อจาก SSH หรือยกเลิก TTY เชลล์และกระบวนการของมันจะได้รับ SIGHUP ทำให้พวกเขายุติ นี้ภายใต้สมมติฐานของฉันเป็นเหตุผล แต่เพียงผู้เดียวสำหรับการใช้nohupในกรณีดังกล่าวหรือtmux, screenet al, ฉันดูคู่มือของ glibc แล้ว : สัญญาณนี้ยังใช้เพื่อรายงานการยุติกระบวนการควบคุมในเทอร์มินัลไปยังงานที่เกี่ยวข้องกับเซสชันนั้น การยุตินี้จะยกเลิกการเชื่อมต่อกระบวนการทั้งหมดในเซสชันจากเทอร์มินัลการควบคุมอย่างมีประสิทธิภาพ ดูเหมือนว่าจะยืนยันความคิดของฉัน แต่เมื่อมองไปไกลมันก็บอกว่า : หากกระบวนการเป็นผู้นำเซสชันที่มีเทอร์มินัลการควบคุมสัญญาณ SIGHUP จะถูกส่งไปยังแต่ละกระบวนการในงานเบื้องหน้าและเทอร์มินัลการควบคุมจะถูกยกเลิกการเชื่อมโยงจากเซสชันนั้น ดังนั้นนี่หมายความว่างานที่อยู่ในพื้นหลังจะไม่ได้รับ SIGHUP หรือไม่? สำหรับความสับสนที่เพิ่มขึ้นของฉันฉันใช้เซสชัน Zsh แบบอินเทอร์แอคทีฟวิ่งyes >& /dev/null &และพิมพ์exitเมื่อ Zsh เตือนฉันว่าฉันทำงานอยู่และหลังจากพิมพ์exitครั้งที่สองบอกฉันว่ามีงานหนึ่งงาน การทำเช่นเดียวกันนี้ใน Bash ทำให้งานหยุดทำงาน ...
10 ssh  tty  signals 

1
เชลล์แบบโต้ตอบควรทำอย่างไรในกลุ่มกระบวนการที่ถูกโยงถึง
(โพสต์ซ้ำในยูนิกซ์ตามคำแนะนำใน/programming/13718394/what-should-interactive-shells-do-in-orphaned-process-group ) คำถามสั้น ๆ คือเชลล์ควรทำอย่างไรถ้าอยู่ในกลุ่มกระบวนการที่ถูกโยงถึงที่ไม่มี tty อยู่? แต่ฉันแนะนำให้อ่านคำถามยาว ๆ เพราะมันสนุก นี่คือวิธีที่สนุกและน่าตื่นเต้นในการเปลี่ยนแล็ปท็อปของคุณให้เป็นเครื่องทำพื้นที่พกพาโดยใช้เปลือกที่คุณชื่นชอบ (ยกเว้นว่าคุณเป็นหนึ่งในพวก tcsh weirdos): #include <unistd.h> int main(void) { if (fork() == 0) { execl("/bin/bash", "/bin/bash", NULL); } return 0; } ทำให้ bash ตรึง CPU ที่ 100% zsh และปลาทำแบบเดียวกันในขณะที่ ksh และ tcsh พึมพำอะไรบางอย่างเกี่ยวกับการควบคุมงานและจากนั้นก็กระดูกงูซึ่งดีกว่าเล็กน้อย แต่ไม่มาก โอ้และเป็นผู้กระทำความผิดที่ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์ม: OS X และ Linux ได้รับผลกระทบทั้งคู่ …

2
ฉันจะดักโปรแกรมที่คืนค่า 139 (การแบ่งเซกเมนต์ผิดพลาด) ใน bash ได้อย่างไร?
ฉันมีสคริปต์ทุบตีที่ทดสอบโปรแกรมบางโปรแกรมและหนึ่งในโปรแกรมส่งคืนSegmentation faultดังนั้นฉันจึงพยายามเพิ่มกับดักไว้ในหัวสคริปต์ของฉัน: trap "echo 'segfault occured!'" SIGSEGV อย่างไรก็ตามไม่ได้ทำอะไรเลย ฉันใช้ echo $? หลังจากโปรแกรมที่สร้าง segfault และฉันได้รับ139เป็นผลลัพธ์ ฉันจะเพิ่มกับดักสำหรับรหัสข้อผิดพลาดเฉพาะนั้นได้อย่างไร

2
ทำไม bash จึงไม่สนใจ SIGTERM
kill -15 -1บางครั้งเมื่อฉันต้องการที่จะออกจากระบบได้อย่างรวดเร็วที่ฉันทำ ฉันสังเกตเห็นว่า bash ไม่สนใจ SIGTERM ฉันสงสัยว่าอะไรคือเหตุผลสำหรับพฤติกรรมทุบตีดังกล่าว ? UNIX ไม่ได้สนใจ SIGTERM มากนักโดยไม่มีเหตุผลใช่ไหม UPDATE: ผลเหมือนกัน (ไม่) สำหรับทุกคน: $ kill -TERM $$ $ type kill kill is a shell builtin $ command kill -TERM $$ $ /bin/kill -TERM $$ UPDATE2: จากคนทุบตี : เมื่อทุบตีเป็นแบบโต้ตอบในกรณีที่ไม่มีกับดักใด ๆ ก็จะละเว้น SIGTERM ดังนั้นมันจึงเสร็จสิ้นตามวัตถุประสงค์ แต่ทำไม
10 bash  signals 

2
สัญญาณที่รอการอนุมัติคืออะไร?
เมื่อดูที่ขีด จำกัด ของกระบวนการทำงานฉันเห็น Max pending signals 15725 นี่คืออะไร? ฉันจะกำหนดมูลค่าที่เหมาะสมสำหรับบริการไม่ว่างได้อย่างไร โดยทั่วไปแล้วฉันไม่สามารถค้นหาหน้าเว็บที่อธิบายว่าแต่ละขีด จำกัด คืออะไร บางไฟล์เป็นแบบอธิบายตัวเอง (ไฟล์เปิดสูงสุด) บางไฟล์อาจน้อยกว่า (ขนาดสูงสุด msgqueue)

4
สัญญาณจะถูกละเว้น (หายไป)?
ฉันมีแอปพลิเคชันที่สื่อสารกับคนงานผ่านสัญญาณ (โดยเฉพาะ SIGUSR1 / SIGUSR2 / SIGSTOP) ฉันสามารถวางใจได้หรือไม่ว่าสิ่งที่เกิดขึ้นทุกสัญญาณจะถูกส่งและประมวลผลโดยตัวจัดการ? จะเกิดอะไรขึ้นหากมีการส่งสัญญาณเร็วกว่าที่เป็นไปไม่ได้สำหรับแอปพลิเคชันในการจัดการสัญญาณเหล่านั้น (เช่นเนื่องจากโหลดโฮสต์สูงในขณะนี้)
9 linux  signals 

4
Ctrl + C ไม่ทำงานใน gnome-terminal
บนโฮสต์ Linux ของฉันดูเหมือนว่าCtrl+ Cจะไม่ทำงานและฉันไม่รู้วิธีดำเนินการต่อเพื่อให้ทำงานได้ ฉันใช้ Ubuntu 10.04 กับ bash 4.1.5 (1) และทำงานใน Gnome-terminal เมื่อฉันกดCtrl+ Cขณะที่สคริปต์นี้ทำงานมันไม่ได้ทำให้ออก #!/bin/bash for i in `seq 500` do ps -e > /dev/null echo $i done

1
ยืนยันการออกโดยใช้กับดัก
ฉันพยายามดักCtrl+Cสัญญาณเพื่อขอคำยืนยันจากผู้ใช้ ส่วนการดักจับทำงานได้ดี แต่เมื่อสัญญาณถูกดักจับมันจะไม่กลับสู่การทำงานปกติ แต่จะออกจากสคริปต์แทน วิธีทำให้มันทำงานต่อเมื่อผู้ใช้กดหมายเลข นี่คือรหัสของฉัน hell() { echo "Do you want to quit? Press 1 for yes and 0 for no"; read n; if [ $n == 1 ]; then exit 1; fi } trap "hell" SIGINT find /

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