ฉันมีโปรแกรมที่ทำงานบนเชลล์ SSH ฉันต้องการหยุดมันชั่วคราวและสามารถหยุดการหยุดชั่วคราวเมื่อฉันกลับมา
วิธีหนึ่งที่ฉันคิดว่าทำคือโอนความเป็นเจ้าของไปยังหน้าจอเชลล์ดังนั้นทำให้มันทำงานอยู่ในนั้น
มีวิธีอื่นในการดำเนินการต่อหรือไม่?
ฉันมีโปรแกรมที่ทำงานบนเชลล์ SSH ฉันต้องการหยุดมันชั่วคราวและสามารถหยุดการหยุดชั่วคราวเมื่อฉันกลับมา
วิธีหนึ่งที่ฉันคิดว่าทำคือโอนความเป็นเจ้าของไปยังหน้าจอเชลล์ดังนั้นทำให้มันทำงานอยู่ในนั้น
มีวิธีอื่นในการดำเนินการต่อหรือไม่?
คำตอบ:
การใช้ GNU screen
เป็นทางออกที่ดีที่สุดของคุณ
หน้าจอเริ่มต้นทำงานเมื่อคุณเข้าสู่ระบบครั้งแรก - ฉันเรียกใช้screen -D -R
เรียกใช้คำสั่งของคุณและยกเลิกหรือระงับด้วยCTRL-Z
แล้วตัดการเชื่อมต่อจากหน้าจอโดยการกดแล้วCTRL-A
D
screen -D -R
เมื่อคุณเข้าสู่เครื่องอีกครั้งและต่อด้วยการวิ่ง คุณจะอยู่ในเปลือกเดียวกันเหมือนก่อน คุณสามารถเรียกใช้jobs
เพื่อดูกระบวนการที่ถูกระงับถ้าคุณทำเช่นนั้นและเรียกใช้%1
(หรืองานที่เกี่ยวข้อง #) เพื่อเบื้องหน้าอีกครั้ง
คุณสามารถเพิกถอน“ ความเป็นเจ้าของ” ของโปรแกรมจากเชลล์ด้วยdisown
บิวด์อิน:
# press Ctrl+Z to suspend the program
bg
disown
อย่างไรก็ตามสิ่งนี้บอกให้เชลล์ไม่ส่งSIGHUP
สัญญาณไปยังโปรแกรมเมื่อเชลล์ออก โปรแกรมจะรักษาการเชื่อมต่อใด ๆ ที่มีกับเทอร์มินัลโดยปกติจะเป็นอินพุตมาตรฐานเอาต์พุตและสตรีมข้อผิดพลาด ไม่มีวิธีในการใส่กลับเข้าไปในเทอร์มินัลอื่น ( หน้าจอทำงานโดยจำลองเทอร์มินัลสำหรับแต่ละหน้าต่างดังนั้นโปรแกรมจะถูกแนบกับหน้าต่างหน้าจอ)
มันเป็นไปได้ที่จะใส่กลับเข้าไป filedescriptors ไปยังไฟล์ที่แตกต่างกันโดยการแนบโปรแกรมในการดีบัก (เช่นใช้ptrace
) และทำให้มันโทรopen
, และdup
close
มีเครื่องมือสองสามอย่างที่ทำสิ่งนี้; นี่เป็นกระบวนการที่ยุ่งยากและบางครั้งพวกเขาก็จะทำผิดพลาดกระบวนการแทน ความเป็นไปได้รวมถึง (ลิงก์ที่รวบรวมจากคำตอบเกี่ยวกับฉันจะปฏิเสธกระบวนการที่กำลังทำงานอยู่และเชื่อมโยงกับเชลล์หน้าจอใหม่ได้อย่างไรและฉันจะไม่ทำให้กระบวนการ / เริ่มต้นขึ้นแล้วหรือไม่ )
disown
ลบกระบวนการออกจากรายการงานควบคุม
disown -h
?
fg
หรือkill
มันและดูว่ามันจะจบลงด้วยตัวเอง
bzcat a.bz2 | grep text
) ได้อย่างไร ผู้ชายreptyr
บอกว่ามันไม่สนับสนุนการย้ายกระบวนการกับเด็ก ๆ
screen
คำตอบที่ได้รับการยอมรับนั้นเหมาะสมที่สุด แต่จริงๆแล้วมันไม่ได้ตอบคำถามซึ่งขอวิธีการเฉพาะในการย้ายกระบวนการที่กำลังทำงานอยู่ไปยังscreen
สิ่งที่ต้องการ โปรดดูคำตอบนี้: serverfault.com/a/284795
โซลูชันโปรดของฉันใช้อยู่tmux
คุณสามารถแยกเซสชั่นและแนบใหม่ในเทอร์มินัลอื่น
เมื่อคุณแยกออกจากเซสชันก่อนหน้าคุณสามารถปิดเครื่องได้อย่างปลอดภัย ใช้ในภายหลังtmux attach
เพื่อกลับไปที่เซสชันแม้ว่าคุณจะออกจากระบบแล้ว
นอกจากนี้ยังมียูทิลิตี้ขนาดเล็กที่เรียกว่าrettyที่ให้คุณติดตั้งโปรแกรมที่เรียกใช้ไปยังเทอร์มินัลอื่น
ฉันไม่ได้ใช้มันเป็นประจำ แต่neercsอ้างว่าสนับสนุนสิ่งนี้ มันเป็นscreen
โปรแกรมที่มีคุณสมบัติแปลก ๆ เช่นการจัดการบานหน้าต่างที่ดีกว่า แต่สิ่งสำคัญที่นำเสนอคือความสามารถในการนำเข้ากระบวนการลงในบานหน้าต่าง
ptrace
) แต่มันไม่เพียงจัดการไฟล์ descriptors เท่านั้น แต่จะทำให้กระบวนการไม่ทำงาน มันสามารถที่จะคว้าfind /
แต่ชน bash แบบโต้ตอบ
หากคุณต้องการหยุดชั่วคราวและเริ่มใหม่หลังจากนั้นคุณสามารถใช้kill
กับSTOP
หรือCONT
ส่งสัญญาณได้
ตอนแรกหากระบวนการ PID ด้วย
$ ps aux
จากนั้นส่งสัญญาณไปยัง PID ที่ระบุไว้ในกระบวนการ
$ kill -STOP <PID>
$ kill -CONT <PID>
"injcode" จาก ThomasHabets ดูเหมือนจะเป็นสิ่งที่ฉันต้องการ:
https://github.com/ThomasHabets/injcode
โปรแกรม injcode อนุญาตให้ใส่รหัสโดยอำเภอใจเข้าสู่กระบวนการทำงานไม่ว่าคุณจะรู้มาก่อนหรือไม่และกำลังเรียกใช้หน้าจอหรือ tmux
จาก README:
ตัวอย่างที่ 1: ย้าย irssi จากเทอร์มินัลหนึ่งไปยังเทอร์มินัลอื่น
อาจย้ายไปไว้ที่หน้าจอ
เริ่ม irssi ในเทอร์มินัลเดียว
เรียกใช้ injcode ในเทอร์มินัลอื่น: $ injcode -m retty
ควรย้าย Irssi ไปยังเทอร์มินัลที่สองรวมถึงการมีเทอร์มินัลการควบคุมใหม่
สิ่งนี้ใช้ได้กับฉัน:
bg
กระบวนการjobs -l
ค้นหาหมายเลขกระบวนการtmux
เริ่มตัวจัดการหน้าต่างเชลล์reptyr -L PROCESSNUMBER
reptyr
's -L
เป็นสิ่งจำเป็นที่จะได้รับการทำงาน:
-L Like '-l', but also redirect the child's stdio to the slave.
เนื่องจากข้อผิดพลาดนี้:
$ reptyr 30622
[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied
และด้วย -L
$ reptyr -L 30622
Opened a new pty: /dev/pts/4