ฉันจะปฏิเสธกระบวนการที่กำลังทำงานอยู่และเชื่อมโยงกับเชลล์หน้าจอใหม่ได้อย่างไร


159

ฉันมีโปรแกรมที่ทำงานบนเชลล์ SSH ฉันต้องการหยุดมันชั่วคราวและสามารถหยุดการหยุดชั่วคราวเมื่อฉันกลับมา

วิธีหนึ่งที่ฉันคิดว่าทำคือโอนความเป็นเจ้าของไปยังหน้าจอเชลล์ดังนั้นทำให้มันทำงานอยู่ในนั้น

มีวิธีอื่นในการดำเนินการต่อหรือไม่?


8
ดูเพิ่มเติมที่ฉันสามารถ nohup / กลั่นกรองกระบวนการที่เริ่มต้นแล้วหรือไม่ และคำสั่ง Resume ที่รันในเซสชัน SSH ที่ถูกดร็อปซึ่งกล่าวถึงโซลูชันที่ใช้ ptrace หลายตัวที่ไม่ได้กล่าวถึงที่นี่
Gilles

จากคำถามเช่นunix.stackexchange.com/a/4039/13496ฉันได้ยินเกี่ยวกับRettyและneercs อืมม ... น่าแปลกใจถ้ามีบเช่น " หน้าจอที่นี่" ชั้นก่อนที่ผมจะเรียกใช้กระบวนการในครั้งต่อไปควรฉันสูญเสียขั้วด้านบนในอนาคตที่จะทำให้มันง่ายที่จะรีบกลับใน stdin / ออก / ไถล
มาร์กอส

ปัญหารอง / โดยปริยายในคำถามนี้ฉันไม่สามารถเข้าใจได้ ... ทำไมเชลล์ถึงเลือกที่จะปฏิเสธงานที่ถูกระงับเมื่อมีการเปิดตัวใหม่ / เพิ่งเปิดตัวหนึ่งในพื้นหลังที่ไม่ต้องการแม้แต่รอ stdin? นี่คือการรักษาผมเคยใช้ในการจึงไม่ทราบว่าไปทำอะไรที่แตกต่างกันที่นี่ ...
มาร์กอส

คำตอบ:


86

การใช้ GNU screenเป็นทางออกที่ดีที่สุดของคุณ

หน้าจอเริ่มต้นทำงานเมื่อคุณเข้าสู่ระบบครั้งแรก - ฉันเรียกใช้screen -D -Rเรียกใช้คำสั่งของคุณและยกเลิกหรือระงับด้วยCTRL-Zแล้วตัดการเชื่อมต่อจากหน้าจอโดยการกดแล้วCTRL-AD

screen -D -Rเมื่อคุณเข้าสู่เครื่องอีกครั้งและต่อด้วยการวิ่ง คุณจะอยู่ในเปลือกเดียวกันเหมือนก่อน คุณสามารถเรียกใช้jobsเพื่อดูกระบวนการที่ถูกระงับถ้าคุณทำเช่นนั้นและเรียกใช้%1(หรืองานที่เกี่ยวข้อง #) เพื่อเบื้องหน้าอีกครั้ง


2
ว้าวฉันไม่อยากจะเชื่อเลยว่าคำตอบของหน้าจอ GNU นั้นได้รับการจัดอันดับต่ำที่สุดในขณะนี้ ฉันพลาดอะไรไปรึเปล่า?
Faheem Mitha

1
บางที! ดูเหมือนว่าดีที่สุดสำหรับฉัน
Andrew Yochum

1
มองย้อนกลับไปเห็นได้ชัดว่ามันเป็นทางออกที่ไม่เจ็บปวดที่สุดให้คุณสามารถวางแผนได้อย่างเหมาะสมและเริ่มกระบวนการจากภายในหน้าจอสภาพแวดล้อม ยังไงก็ตามฉันทำให้มันเป็นคำตอบอย่างเป็นทางการ!
levesque

28
ฉันคิดว่านี่ไม่ตอบคำถาม คำถามเริ่มต้นด้วย " ฉันมีโปรแกรมทำงานอยู่ " คำตอบนี้สมมติว่ามันยังไม่ทำงาน ...
Anko

ใช่เขาเขียนไว้อย่างชัดเจนว่าเขาต้องการนำมันเข้าสู่เซสชั่นหน้าจอ :-)
Florian Heigl

112

คุณสามารถเพิกถอน“ ความเป็นเจ้าของ” ของโปรแกรมจากเชลล์ด้วยdisownบิวด์อิน:

# press Ctrl+Z to suspend the program
bg
disown

อย่างไรก็ตามสิ่งนี้บอกให้เชลล์ไม่ส่งSIGHUPสัญญาณไปยังโปรแกรมเมื่อเชลล์ออก โปรแกรมจะรักษาการเชื่อมต่อใด ๆ ที่มีกับเทอร์มินัลโดยปกติจะเป็นอินพุตมาตรฐานเอาต์พุตและสตรีมข้อผิดพลาด ไม่มีวิธีในการใส่กลับเข้าไปในเทอร์มินัลอื่น ( หน้าจอทำงานโดยจำลองเทอร์มินัลสำหรับแต่ละหน้าต่างดังนั้นโปรแกรมจะถูกแนบกับหน้าต่างหน้าจอ)


มันเป็นไปได้ที่จะใส่กลับเข้าไป filedescriptors ไปยังไฟล์ที่แตกต่างกันโดยการแนบโปรแกรมในการดีบัก (เช่นใช้ptrace) และทำให้มันโทรopen, และdup closeมีเครื่องมือสองสามอย่างที่ทำสิ่งนี้; นี่เป็นกระบวนการที่ยุ่งยากและบางครั้งพวกเขาก็จะทำผิดพลาดกระบวนการแทน ความเป็นไปได้รวมถึง (ลิงก์ที่รวบรวมจากคำตอบเกี่ยวกับฉันจะปฏิเสธกระบวนการที่กำลังทำงานอยู่และเชื่อมโยงกับเชลล์หน้าจอใหม่ได้อย่างไรและฉันจะไม่ทำให้กระบวนการ / เริ่มต้นขึ้นแล้วหรือไม่ )


disownลบกระบวนการออกจากรายการงานควบคุม
ctrl-alt-delor

3
ทำไมไม่disown -h?
Cees Timmerman

@CeesTimmerman ที่ออกจากงานในตารางงานของเชลล์ แต่ข้อดีของมันคืออะไร?
Gilles

@Gilles: เพื่อให้คุณยังสามารถfgหรือkillมันและดูว่ามันจะจบลงด้วยตัวเอง
Peter Cordes

ยูทิลิตี้ที่กล่าวถึงทำงานกับกลุ่มของกระบวนการ (เช่นbzcat a.bz2 | grep text) ได้อย่างไร ผู้ชายreptyrบอกว่ามันไม่สนับสนุนการย้ายกระบวนการกับเด็ก ๆ
dma_k

64

ที่จะย้ายกระบวนการระหว่างขั้วหรือการใส่กลับเข้าไปปฏิเสธคุณสามารถใช้เช่นreptyr


1
ใช่ที่บันทึกไว้ขอบคุณ! ฉันอ่านเว็บไซต์ของผู้แต่งว่ามันทำงานอย่างไรดีกว่าเครื่องมือที่คล้ายกันหรือรุ่นเก่ากว่า สำหรับโปรแกรม ncurses
Marcos

4
นี่มันเจ๋งมาก; มันควรจะแก้ไขสถานการณ์ของเพื่อนที่ต้องสูญเสียงานของเธออย่างต่อเนื่องโดยเรียกใช้มันอย่างตรงไปตรงมาแล้วจึงต้องขึ้นรถไฟ "โอ๊ะลืมใช้หน้าจออีกครั้ง"
Adam Katz

3
+1 แม้ว่าscreenคำตอบที่ได้รับการยอมรับนั้นเหมาะสมที่สุด แต่จริงๆแล้วมันไม่ได้ตอบคำถามซึ่งขอวิธีการเฉพาะในการย้ายกระบวนการที่กำลังทำงานอยู่ไปยังscreenสิ่งที่ต้องการ โปรดดูคำตอบนี้: serverfault.com/a/284795
toxefa

1
ประหยัดสดแน่นอน อนุญาตให้ฉันแนบอีกครั้งเพื่อเรียกใช้ apt dist-upgrade ที่กำลังรอการยืนยันจากผู้ใช้
andig

28

โซลูชันโปรดของฉันใช้อยู่tmuxคุณสามารถแยกเซสชั่นและแนบใหม่ในเทอร์มินัลอื่น

เมื่อคุณแยกออกจากเซสชันก่อนหน้าคุณสามารถปิดเครื่องได้อย่างปลอดภัย ใช้ในภายหลังtmux attachเพื่อกลับไปที่เซสชันแม้ว่าคุณจะออกจากระบบแล้ว


1
คุณยังสามารถแชร์เซสชันของคุณกับเพื่อน ๆ ของคุณและใช้หน้าต่างและบานหน้าต่างหลายบานและอีกมากมาย! รักมัน ^ _ ^
igor

ตัวอย่างของการใช้โปรด?
Vitaly Zdanevich

21

นอกจากนี้ยังมียูทิลิตี้ขนาดเล็กที่เรียกว่าrettyที่ให้คุณติดตั้งโปรแกรมที่เรียกใช้ไปยังเทอร์มินัลอื่น


19

ฉันไม่ได้ใช้มันเป็นประจำ แต่neercsอ้างว่าสนับสนุนสิ่งนี้ มันเป็นscreenโปรแกรมที่มีคุณสมบัติแปลก ๆ เช่นการจัดการบานหน้าต่างที่ดีกว่า แต่สิ่งสำคัญที่นำเสนอคือความสามารถในการนำเข้ากระบวนการลงในบานหน้าต่าง


2
น่าสนใจ มันเล่นสกปรก ( ptrace) แต่มันไม่เพียงจัดการไฟล์ descriptors เท่านั้น แต่จะทำให้กระบวนการไม่ทำงาน มันสามารถที่จะคว้าfind /แต่ชน bash แบบโต้ตอบ
Gilles

@Gilles ฉันจำไม่ได้ว่ามันไปอย่างไรเมื่อฉันพยายาม แต่มันไม่มีชื่อเสียงที่ดีฉันบอกว่ามันล้มเหลวอย่างสม่ำเสมอ
Michael Mrozek

9

หากคุณต้องการหยุดชั่วคราวและเริ่มใหม่หลังจากนั้นคุณสามารถใช้killกับSTOPหรือCONTส่งสัญญาณได้

ตอนแรกหากระบวนการ PID ด้วย

$ ps aux

จากนั้นส่งสัญญาณไปยัง PID ที่ระบุไว้ในกระบวนการ

$ kill -STOP <PID>

$ kill -CONT <PID>

9

"injcode" จาก ThomasHabets ดูเหมือนจะเป็นสิ่งที่ฉันต้องการ:

https://github.com/ThomasHabets/injcode

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

จาก README:

ตัวอย่างที่ 1: ย้าย irssi จากเทอร์มินัลหนึ่งไปยังเทอร์มินัลอื่น

อาจย้ายไปไว้ที่หน้าจอ

เริ่ม irssi ในเทอร์มินัลเดียว

เรียกใช้ injcode ในเทอร์มินัลอื่น: $ injcode -m retty

ควรย้าย Irssi ไปยังเทอร์มินัลที่สองรวมถึงการมีเทอร์มินัลการควบคุมใหม่


1

สิ่งนี้ใช้ได้กับฉัน:

  1. bg กระบวนการ
  2. jobs -l ค้นหาหมายเลขกระบวนการ
  3. tmux เริ่มตัวจัดการหน้าต่างเชลล์
  4. 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.