Ctrl + c ในกระบวนการย่อยกำลังฆ่ากระบวนการที่ไม่มีการอัปโหลดก่อนหน้านี้ในสคริปต์


15

ฉันไม่รู้ว่าสิ่งนี้เป็นของ SO หรือไม่ (เพราะเป็นข้อผิดพลาดในการเขียนโค้ด) แต่คิดว่าพวกคุณจะมีความรู้มากขึ้นเกี่ยวกับรายละเอียดปลีกย่อยของซอฟต์แวร์ที่ใช้ (อาจเป็นเพราะคุณอาจพิจารณา U&L)

นี่คือสคริปต์โค้ดขั้นต่ำ (ดูการแก้ไขสคริปต์แบบเต็มมีเหตุผลที่ฉันทำเช่นนี้)

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

สิ่งที่พยายามทำคือเรียกใช้เซิร์ฟเวอร์ในพื้นหลังซึ่งส่งออกไปยังไฟล์บันทึก
จากนั้นผมล็อกไฟล์ที่ใช้follow less +Fในการออกจากสิ่งนี้คุณต้องกดctrl+ cก่อนจึงจะสามารถกดQได้

จะเกิดอะไรขึ้นเมื่อฉันctrl+ cภายในlessคำสั่ง (หยุดtailing) มันจะฆ่าเซิร์ฟเวอร์ที่เริ่มต้นด้วยnohupที่ด้านบน! ไม่มีอะไรได้รับผลกระทบ ฉันสามารถshift+ fเพื่อเริ่มปรับแต่งบันทึกอีกครั้ง (ซึ่งไม่ได้รับข้อมูลใหม่เนื่องจากเซิร์ฟเวอร์ถูกฆ่าตาย) และถ้าฉันกดQส่วนที่เหลือของสคริปต์ดำเนินการตามปกติ

คุณรู้ไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้น ฉันจะหลีกเลี่ยง / ใช้อย่างอื่นได้อย่างไร


PS
โปรแกรมเซิร์ฟเวอร์อาจกำลังฟัง a ^Cซึ่งอาจเป็นปัญหา มีบางอย่างที่ฉันสามารถทำได้เพื่อหยุดสิ่งนั้น เช่นเมื่อฉันเพิ่งรัน{SERVERCOMMAND}ด้วยตัวเอง (ในลักษณะบล็อก) ฉันสามารถกดctrl+ cซึ่งไม่ฆ่ามันทันที มันพิมพ์Received ^C signal, shutting down(และจากนั้นจะฆ่าตัวเอง) นี่คือสิ่งที่เกิดขึ้นเมื่อฉัน^Cเข้าless(มีการReceived ^C signal, shutting downเขียนขั้นสุดท้ายลงในบันทึก)


PPS
ฉันได้ลองทำหลายอย่างแล้ว (ไม่ทำงาน);

  • พยายามยกเลิกการเชื่อมต่อ stdin จากสคริปต์โดยเปลี่ยน

    nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
    to
    nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    or
    nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
  • ใช้stty intr ^Gเพื่อแทนที่คำสั่งขัดจังหวะ แต่แล้วctrl+ gก็ทำสิ่งที่^Cทำอยู่แล้ว (ดังนั้นนี่อาจเป็นปัญหากับเทอร์มินัลอีมูเลเตอร์ของฉันแทน; konsole)

  • วางnohup& / หรือlessบรรทัดในวงเล็บ (เพื่อให้เป็น subshell)

  • เรียกใช้สคริปต์xtermแทนkonsole


บางคนอาจเจอปัญหาของฉัน I think it is due to the handling within the database software, not on the shell. โปรแกรมจะทำเช่นนี้ได้อย่างไร แล้วฉันจะหยุดมันได้อย่างไร
Hashbrown

3
nohupป้องกันกระบวนการจากการรับSIGHUPสัญญาณในขณะที่ CTRL + C ส่งSIGINTสัญญาณ นั่นเป็นสาเหตุที่nohupไม่มีผลกระทบตามที่คุณคาดหวัง
Piotr Dobrogost

คำตอบ:


11

ฉันคิดถูกว่ามันSIGINTถูกส่งไปยังกระบวนการทั้งหมดเมื่อctrl+ cแต่ฉันคิดว่าการทำกระบวนการอื่นจะทำให้มันอยู่นอกกระบวนการprocess group(ดูความพยายามของฉันในP.P.S.)

นี่คือไม่เพียง แต่กรณีการใช้งานที่ถูกต้อง แต่เป็นวิธีการแก้ไขที่ถูกต้อง

เนื่องจากสคริปต์ของฉันมีโครงสร้างคำตอบที่ไม่ตรงกับทุกคำนี่คือตอนนี้สคริปต์;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

เซิร์ฟเวอร์ยังคงส่งออกไปยังแฟ้มบันทึกหลังจากที่ผมctrl+ ในcless

ขอบคุณสำหรับเวลาของทุกคน


0

คุณลองปฏิเสธแล้วหรือยัง

  disown -h %1

หรืองานของคุณคืออะไร; disownเป็นเชลล์ในตัวสถานะหน้าเพจของมัน:

ปฏิเสธ

ปฏิเสธ [-ar] [-h] [jobspec ... ]

หากไม่มีตัวเลือกแต่ละงานจะถูกลบออกจากตารางของงานที่ใช้งานอยู่ หากตัวเลือก-h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'หรือ-r' option is supplied, the current job is used. If no jobspec is supplied, the-a' หมายถึงการลบหรือทำเครื่องหมายงานทั้งหมด; ตัวเลือก `-r 'โดยไม่มีอาร์กิวเมนต์ jobspec จะ จำกัด การดำเนินการในการรันงาน

แก้ไข

สิ่งที่ตลกการก่อสร้างของคุณใช้ได้กับ Arch Linux ของฉัน:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

ก่อนที่PSคำสั่งผมต้องเลื่อนไฟล์ out.log แล้วแล้วCtrl+Cq


ใช่ แต่ฉันไม่รู้วิธีนำไปใช้ ฉันพยายามวางnohupสายในการทำงานที่disownsตัวเอง nohupแต่ที่ควรจะเป็นเช่นเดียวกับ ฉันไม่คิดว่านี่เป็นSIGHUPปัญหาเพราะเมื่อฉันลบlessบรรทัดสคริปต์จะสรุปว่าเซิร์ฟเวอร์ยังคงทำงานอยู่
Hashbrown

@Hashbrown โปรดดูการแก้ไขของฉัน
MariusMatutiae

ใช่ฉันทำการทดสอบด้วยโดยใช้สคริปต์ทุบตีแบบง่ายๆแทนการเรียกใช้ {SERVER} และไม่มีใครทำงานได้ดี ดูความคิดเห็นของฉันในคำถาม ฉันคิดว่ามันตั้งใจฟังอย่างใด เนื่องจากมันเป็นเซิร์ฟเวอร์ที่เหมาะสม (และไม่เป็นที่รู้จักกันดี) ฉันไม่สามารถแม้แต่จะบอกได้ว่ามันคืออะไรเพื่อให้ใครบางคนสามารถไป "โอ้มันกำลังทำ X คุณต้องทำ Y"
Hashbrown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.