วิธีการทำให้กระบวนการทำงานหลังจากสิ้นสุดเซสชัน ssh?


644

สมมติว่าฉันเปิดใช้กระบวนการจำนวนมากจากเซสชัน ssh เป็นไปได้ที่จะยกเลิกเซสชัน ssh ในขณะที่ยังคงกระบวนการเหล่านั้นทำงานบนเครื่องระยะไกล?


2
ที่เกี่ยวข้อง: unix.stackexchange.com/questions/4004/…
Anton Tarasenko

คำตอบ:


750

tmuxคุณควรมองหาทางเลือกที่ทันสมัยเช่น

tmuxเหนือกว่าscreenด้วยหลายเหตุผลนี่เป็นเพียงตัวอย่าง:

  • Windows สามารถเคลื่อนย้ายระหว่างเซสชันและเชื่อมโยงกับหลายเซสชันได้
  • Windows สามารถแบ่งตามแนวนอนและแนวตั้งเป็นบานหน้าต่าง
  • รองรับเทอร์มินัลสี UTF-8 และ 256
  • เซสชั่นสามารถควบคุมได้จากเปลือกโดยไม่จำเป็นต้องเข้าสู่เซสชั่น

ฟังก์ชั่นพื้นฐาน

ในการรับฟังก์ชั่นเดียวกับที่อธิบายไว้ในคำตอบที่แนะนำscreenคุณจะต้องทำสิ่งต่อไปนี้:

  • ssh เข้าไปในเครื่องระยะไกล
  • เริ่มต้นtmuxด้วยการพิมพ์tmuxลงในเปลือก
  • เริ่มกระบวนการที่คุณต้องการภายในtmuxเซสชั่นเริ่มต้น
  • ออกจาก / แยกtmuxเซสชันโดยพิมพ์Ctrl+ bแล้วd

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

หากคุณต้องการที่จะมีการประชุมทำงานหลายด้านโดยด้านที่คุณควรตั้งชื่อแต่ละเซสชั่นการใช้Ctrl+ และb $คุณจะได้รับรายชื่อของการประชุมที่กำลังทำงานอยู่โดยใช้ตอนนี้แนบไปกับเซสชั่นการทำงานที่มีคำสั่งtmux list-sessionstmux attach-session -t 0

tmuxสามารถทำสิ่งขั้นสูงมากกว่าจัดการหน้าต่างเดียวในเซสชันเดียว สำหรับข้อมูลเพิ่มเติมดูได้ในman tmuxหรือtmux หน้า โดยเฉพาะอย่างยิ่งนี่คือคำถามที่พบบ่อยเกี่ยวกับความแตกต่างที่สำคัญระหว่างและscreentmux


4
@CraigM ใช้screen -x -r [screenname]หรือscreen -rxย่อหากคุณมีเซสชันหน้าจอเดียวที่ใช้งานอยู่ สิ่งนี้อนุญาตให้คุณแนบอินสแตนซ์ของหน้าจอที่มีอยู่
Lekensteyn

5
คำแนะนำนี้ช่วยฉันด้วยปัญหาเดียวกัน แต่ฉันคิดว่ามันมีการพิมพ์ผิด ฉันค่อนข้างมั่นใจว่าคุณต้องพิมพ์Ctrl-bแล้วจึงdจะออก / ถอดtmuxเซสชัน แน่นอนว่าเป็นกรณีสำหรับเวอร์ชั่นของtmuxUbuntu 12.04 ของฉัน
cxrodgers

17
ฉันทำผิดพลาดในขณะที่ทำตามคำแนะนำด้านบน ฉันจะแบ่งปันหากใครอาจตกอยู่ในข้อผิดพลาดเดียวกัน: ฉันเริ่ม tmux ในเปลือกของคอมพิวเตอร์ของฉันเองแทนที่จะเปลือกของคอมพิวเตอร์ระยะไกล หนึ่งต้องเริ่ม tmux ในเปลือกของคอมพิวเตอร์ระยะไกล
Mert Nuhoglu

5
ขณะนี้หน้าจอกำลังได้รับการพัฒนาอีกครั้ง: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.htmlคุณสามารถอัปเดตคำตอบของคุณได้ไหม
muru

4
หรือเรียกใช้tmux detachแทนการพิมพ์ctrl-b d
Andrew

305

ตัวเลือกที่ 1: nohup

วิธีที่ดีที่สุดมักจะง่ายที่สุด

nohup long-running-command &

มันถูกสร้างขึ้นมาโดยเฉพาะสำหรับการนี้ก็ยังบันทึก stdout nohup.logไป

man nohup

ตัวเลือก 2: bg

หากคุณต้องการ "แบ็คกราวน์" บางงานที่กำลังดำเนินการอยู่ดังนั้นทางออกที่ดีที่สุดของคุณคือCtrl+ Zแล้วเรียกใช้

bg

เพื่อทำให้งานที่ถูกระงับล่าสุดของคุณกลับมาเป็นแบ็คกราวด์

จากนั้นอย่างรวดเร็วdisownควรให้กระบวนการทำงานหลังจากที่คุณออกจากระบบ

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

โปรดจำไว้ว่าทั้งสองเป็นทุบตีเฉพาะ หากคุณไม่ได้ใช้ bash คำสั่งอาจแตกต่างกัน


4
ฉันอยากจะแนะนำให้ทำdisown -h
มิเชล

หน้าจอที่น่าสนใจและ tmux ไม่ทำงานสำหรับคนงานเหมือง, bur nohup ทำงาน
Yasin Okumuş

1
bg+ disownไม่ทำงานสำหรับฉัน ฉันมีสคริปต์การปรับใช้ที่ใช้งานอยู่ฉันลืมที่จะเริ่มต้นภายใน tmux และต้องออกจากการประชุมก่อน สคริปต์ส่งออกความคืบหน้าไปยังเชลล์อย่างต่อเนื่อง ctrl+zหยุดกระบวนการส่งคืนฉันไปทุบตี bgกลับสู่กระบวนการทำงานต่อ แต่ก็กลับมาแสดงสถานะเป็นทุบตีอีกครั้งทำให้ไม่สามารถเห็นสิ่งที่ฉันพิมพ์ได้ อย่างไรก็ตามdisownคำสั่งสร้าง "ปฏิเสธ: ปัจจุบัน: ไม่มีงานดังกล่าว"
BrianHVB

สิ่งนี้ไม่ได้ผลสำหรับฉันด้วยjulia myFile.jlเหตุผลใดก็ตาม tmux ทำและยอดเยี่ยม
kilgoretrout

สิ่งนี้ได้ผลสำหรับฉันขอบคุณมาก
ชาด

207

screenคุณสามารถดำเนินการได้โดยใช้

พิมพ์man screenเพื่อหาข้อมูลเพิ่มเติมหรืออ่านหน้าคนหน้าจอ

สถานการณ์ง่าย ๆ :

  • ssh ลงในกล่องรีโมตของคุณ พิมพ์screenจากนั้นเริ่มกระบวนการที่คุณต้องการ

  • กดCtrl- Aแล้ว-Ctrl Dนี่จะเป็นการ "แยก" เซสชั่นหน้าจอของคุณ แต่ปล่อยให้กระบวนการทำงาน ตอนนี้คุณสามารถออกจากระบบของกล่องระยะไกล

  • ถ้าคุณต้องการที่จะกลับมาในภายหลังให้เข้าสู่ระบบอีกครั้งและพิมพ์screen -rสิ่งนี้จะ "ดำเนินการ" เซสชั่นหน้าจอของคุณและคุณสามารถเห็นผลลัพธ์ของกระบวนการของคุณ


32
ฉันมักจะตั้งชื่อเซสชันหน้าจอของฉันโดยใช้screen -S nameเพื่อให้ง่ายต่อการเชื่อมต่อกับสิ่งที่ถูกต้องในภายหลัง
David Oneill

ลิงก์ไม่ทำงาน
Gab 是好人

1
โดยส่วนตัวฉันทำงานกับกล่องโดยไม่มีซอฟต์แวร์ควบคุมแพ็คเกจ หลังจากใช้เวลาประมาณครึ่งชั่วโมงในการสร้างการพึ่งพาสำหรับ TMUX (ซึ่งฉันเองมีประสบการณ์และชอบ) จากแหล่งที่มามันก็เห็นได้ชัดว่าหน้าจอเป็นทางออกที่ดีและง่ายกว่าสำหรับฉัน TL; DR: ทางออกที่ดีที่สุดสำหรับปัญหานี้ขึ้นอยู่กับกรณีการใช้งานเครื่องและเวลาที่คุณต้องตั้งค่า ขอบคุณสำหรับคำตอบนี้ :)
Max von Hippel

รวมกับscreen -Sก่อนออกเดินทางและscreen -rเมื่อกลับมาเป็นที่น่าอัศจรรย์!
Meloman

ขอบคุณสำหรับสิ่งนี้. วิธีนี้ใช้ได้ผลสำหรับฉันในขณะที่ tmux ไม่ได้ (ฉันใช้ bash รุ่นหนึ่งสำหรับ windows ในขณะที่กำลังโหลดลงในเครื่อง linux)
Michael Sorensen

83

Screen และ nohup เป็นวิธีที่ดีกว่า แต่ถ้าคุณต้องแยกกระบวนการที่กำลังทำงานอยู่โดยไม่มีหน้าจอหรือ nohup คุณสามารถเรียกใช้คำสั่ง disown

disown [-ar] [-h] [jobspec… |pid… ]

หากไม่มีตัวเลือกให้ลบjobpecแต่ละอันออกจากตารางงานที่กำลังทำงานอยู่ หากได้รับ-hตัวเลือกงานจะไม่ถูกลบออกจากตาราง แต่จะถูกทำเครื่องหมายเพื่อไม่ให้ SIGHUP ส่งไปยังงานหากเชลล์ได้รับ SIGHUP หากjobspecไม่มีอยู่และไม่จัดหา-aหรือไม่มี-rตัวเลือกงานปัจจุบันจะถูกใช้ ถ้าไม่มีjobspecจะถูกส่งไปที่-aตัวเลือกหมายความว่าจะลบหรือทำเครื่องหมายงานทั้งหมด; -rตัวเลือกโดยไม่ต้องjobspecอาร์กิวเมนต์ จำกัด การดำเนินงานการทำงาน

ด้วยการปฏิเสธคุณสามารถปิดเครื่องและทำให้กระบวนการทำงานบนเครื่องได้


10
นี่เป็นวิธีที่ฉันชอบที่จะทำ ฉันใช้บ่อยๆdisown -a && exit
Stefano Palazzo

1
สมบูรณ์ นี่คือคำสั่งที่น่ารักและสมควรได้รับ upvotes ทั้งหมด!
เกร็ก

8
คำเตือนหนึ่งคำฉันหยุดกระบวนการทำงานด้วย Ctrl-Z และไม่ได้เริ่มทำงานในพื้นหลังก่อนที่จะโทรdisownและมันฆ่ามัน
HDave

3
อาจผิดพลาดหากต้องการเขียนถึงเทอร์มินัล การเปลี่ยนเส้นทางเอาต์พุตของกระบวนการทำงานไม่ใช่เรื่องง่าย ดีกว่าที่จะเริ่มต้นอย่างถูกต้องด้วย nohup
jiggunjer

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

53

ฉันติดอยู่ใน mv ขนาดใหญ่ดังนั้นฉันจึงไม่สามารถหยุดกระบวนการหน้าจอตั้งค่าแล้วเริ่มใหม่อีกครั้ง ฉันจัดการเพื่อออกจากเซสชัน ssh ด้วยกระบวนการทำงานโดยทำตามขั้นตอนต่อไปนี้:

  1. ssh [เซิร์ฟเวอร์]
  2. คำสั่ง
  3. Ctrl+Z
  4. BG
  5. ปฏิเสธ [กระบวนการ pid เป็นตัวเลือกค่าเริ่มต้นเป็นค่าสุดท้าย]
  6. ทางออก

ขั้นตอนที่ 3 หยุดกระบวนการปัจจุบันชั่วคราว (เช่นคำสั่ง 'mv' ของฉัน)
ขั้นตอนที่ 4 กำหนดกระบวนการที่หยุดชั่วคราวไว้ในพื้นหลังและดำเนินการต่อ
ขั้นตอนที่ 5 ให้คุณปฏิเสธกระบวนการ **หากต้องการดูรายการงานพิมพ์jobsก่อนหน้านี้


**เกี่ยวกับการปฏิเสธ (จากคู่มือทุบตี):

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec 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 no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.

2
บิวท์อินเป็นตัวเลือกแรกของฉันเสมอ :) ขอบคุณ
ken_oy

คำตอบนี้ควรทำเครื่องหมายว่าถูกต้อง ในการติดตั้งและทำความคุ้นเคยกับการคัดกรองเพื่อแก้ไขปัญหานี้ถือว่าเกินความจริง
Ulrich-Lorenz Schlüter

สิ่งนี้มีประโยชน์มากเมื่อคุณเริ่มต้นคำสั่งใด ๆ และกำลังทำงานเป็นเวลานาน การยกเลิกและเริ่มต้นในเซสชั่น TMUX จะใช้เวลา
Deepali Mittal

1
@ tom-brossman: โปรดระวังการแก้ไขที่ไม่จำเป็นเช่นนี้ ! หากเรียกใช้โดยไม่มีข้อกำหนดคุณลักษณะdisownงานคำสั่งในตัวจะทำงานกับงานแบ็กกราวน์ล่าสุด
David Foerster

22

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

Byobu

Byobu สามารถติดตั้งบนคอมพิวเตอร์ได้โดยทำในเครื่องที่ใช้ Debian:

sudo aptitude install byobu

ใช้ yum คุณทำ

su -c 'yum install byobu'

นอกจากนี้ยังสามารถติดตั้ง byobu ในดิสทริบิวชันอื่น ๆ ได้

ใช้ byobu

คุณสามารถเริ่มต้น byobu โดยเรียกใช้byobuบนเครื่องโฮสต์หลังจากเชื่อมต่อโดยใช้ ssh นี่จะให้เชลล์ที่มีหน้าตาแบบนี้:

ภาพ byobu

คุณยังสามารถใช้ Byobu Terminal บนเครื่อง Ubuntu พร้อมตัวเลือก -X และใช้งาน byobu ได้อย่างสมบูรณ์แบบ

การใช้งาน:

เริ่ม byobu byobuโดยการพิมพ์

คุณสามารถกด F2 เพื่อสร้างหน้าต่างใหม่ภายในเซสชันปัจจุบัน F3-F4 เพื่อสลับระหว่างหน้าต่างต่างๆ

ส่วนที่ดีที่สุดเกี่ยวกับ byobu คือคุณไม่จำเป็นต้องฆ่ากระบวนการที่เรียกใช้ในเทอร์มินัลเพื่อออกจากเทอร์มินัล คุณสามารถส่งหน้าจอ / tmux (โครงกระดูกของ byobu) ไปยังพื้นหลังและดำเนินการต่อในครั้งต่อไปที่คุณมา:

  • หากต้องการออกจาก byobu และ keeep ให้รัน (แยกออก) กด F6
  • ครั้งต่อไปที่คุณมาก็แค่ทำbyobuแล้วคุณจะกลับมาที่เดิม

    byobu-detach แนบ

คุณยังสามารถสร้างเซสชัน byobu ที่หลากหลายได้byobu -S session1เช่นกัน และคุณสามารถเชื่อมต่อกับพวกเขาเมื่อคุณกลับมา

คุณสามารถทำได้มากขึ้นโดยใช้ Byobu ใช้มัน! บางคำแนะนำที่ชัดเจนอยู่ที่นี่หรือที่นี่


ฉันพยายามใช้ byobu จากเซสชัน PuTTY ที่ใช้กับกล่อง Ubuntu ของฉัน แต่ฉันได้รับบรรทัดสถานะซ้ำและเลื่อนบนจอแสดงผล แม้ว่าจะถูกดึงออกมาอย่างถูกต้องเมื่อกด F6 แต่มันก็ไม่ใช่วิธีแก้ปัญหาที่เป็นประโยชน์ในการตั้งค่าของฉัน
jfmessier

1
@jfmessier เป็นเพราะ PuTTY ไม่ใช้ ncurses (utf-8 โดยทั่วไป) ดี เป็นไปได้ที่จะกำจัดปัญหานี้โดยทำตามหัวข้อนี้ - stackoverflow.com/questions/10731099/ …
SiddharthaRT

นี่มันเจ๋งมาก! 1. มันให้ฉันพร้อมท์ทุบตีสีที่ฉันไม่สามารถเปิดใช้งานด้วยการทุบตีเป็นเปลือกเริ่มต้นของฉันและ 2 ฉันได้รับการเรียกใช้ 2 บอทในเวลาเดียวกันและยังมีขั้วอื่นที่จะทำงาน! @SiddharthaRT คุณสมควรได้รับการโหวต!
Dev

18

คุณไม่สามารถทำสิ่งนี้ได้เมื่อกระบวนการเริ่มต้นขึ้นคุณจะต้องจัดเตรียมสิ่งต่าง ๆ ก่อนที่คุณจะทำงานที่ยาวนาน

คุณสามารถใช้nohupแต่ภูมิปัญญาที่ทันสมัยแนะนำให้คุณใช้หน้าจอหรือ byobu เป็นข้อมูลเข้าสู่ระบบของคุณเพื่อให้คุณสามารถแยกและออกจากสิ่งที่ทำงาน

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

มีคู่มือเริ่มต้นใช้งานที่เหมาะสมในการคัดกรองหน้าจอที่นี่

byobuทำให้การใช้อินเตอร์เฟซบนหน้าจอเป็นเรื่องง่ายด้วยเมนูและอื่น ๆ นอกจากนี้ยังเป็นการนำหน้าจอปัจจุบันไปใช้กับ Ubuntu รุ่นใหม่ F2 เพื่อเริ่มต้นเทอร์มินัลใหม่ F3 / F4 เพื่อสลับไปมาและ F6 เพื่อยกเลิกการเชื่อมต่อ พิมพ์ exit เพื่อสิ้นสุดเทอร์มินัลอย่างถาวร


byobu ใช้ tmux วันนี้ ..
scottl

12
"คุณไม่สามารถทำสิ่งนี้ได้เมื่อกระบวนการเริ่มต้นขึ้นคุณต้องจัดเตรียมสิ่งต่าง ๆ ก่อนที่จะทำงานที่ยาวนาน" - ไม่คุณสามารถใช้disownเพื่อให้บรรลุสิ่งนี้ ดูคำตอบ @ bassgey ของ
Rich

1
หลังจากดิ้นรนที่จะเรียนรู้หน้าจอและ tmux .... byobu นำน้ำตามาสู่สายตาของฉัน
HDave

disownและหากมีความจำเป็นเพียงCtrl-zแล้วbgจะได้รับมันของอาคารที่ใช้งานและพื้นหลัง จากนั้นdisown.
mimoralea

8

เฮ้ในขณะที่ฉันตกลงว่าหน้าจอเป็นตัวเลือกที่มีประสิทธิภาพที่สุด คุณสามารถใช้ vncserver แล้วเริ่มกระบวนการ

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

ขั้นแรกคุณต้องส่งกระบวนการไปที่พื้นหลังโดยพิมพ์ Ctrl + Z ตามด้วย bg% 1 (จำนวนขึ้นอยู่กับหมายเลขงานโดยปกติคือ 1 แต่คุณสามารถดึงรายการโดยใช้งานคำสั่งได้อย่างง่ายดาย)

ในที่สุดเรียกใช้คำสั่งปฏิเสธ (ตามด้วย jobid ... เช่นเดียวกับคำสั่ง bg)

สิ่งนี้จะลบความสัมพันธ์พาเรนต์ - ลูกระหว่างเชลล์ของคุณและกระบวนการในพื้นหลังเพื่อป้องกันไม่ให้ตายเมื่อเชลล์ของคุณถูกยกเลิก


2
คำตอบนี้ดีที่สุด! ทำไมทุกคนพูดถึงscreenคำถามที่ถูกวางเหตุการณ์หลังการเข้าสู่ระบบวิธีการให้กระบวนการทำงานตอนนี้หลังจากเข้าสู่ระบบ แต่ก่อนที่จะเริ่มพวกเขา คำตอบที่ดี Jorge คุณช่วยฉันจริงๆ! :)
jwbensley

1
เพียงแค่bg(โดยไม่%1) มักจะเพียงพอเนื่องจากค่าเริ่มต้นคืองานปัจจุบัน
วอลเตอร์ Tross

มันจะดีที่จะมีคำตอบที่ครอบคลุม: นิรนัย (การตั้งค่าล่วงหน้า): หน้าจอ terminal ASCII (เก่า), tmux (Neewer); X windows: vnc (เก่ายังคงอยู่), xpra (ใหม่กว่า) โดยที่ xpra ไม่มีรูต ผู้อยู่เบื้องหลัง (ยังคงอยู่หลังจากที่คุณเริ่ม): ^ Z, ปฏิเสธ, ... แต่ฉันขี้เกียจเกินกว่าที่จะเนื้อมันออกมามากกว่านี้
Krazy Glew

8

สำหรับเชลล์สคริปต์เดียวที่ฉันใช้เป็นเวลานานฉันจะเข้าสู่ระบบและรันกระบวนการในพื้นหลังโดยใช้ '&'

ตัวอย่าง:

/path/to/my/script &

ฉันออกจากระบบและยกเลิกการเชื่อมต่อเซสชัน SSH ของฉันแล้ว เมื่อฉันเข้าสู่ระบบในภายหลังสคริปต์ยังคงดำเนินการตามที่พิสูจน์โดยการรวบรวมข้อมูลอย่างต่อเนื่องจากสคริปต์


3
ใช่ฉันอยากรู้ว่าหน้าจอ / tmux ดีกว่าโซลูชันที่เรียบง่ายนี้ได้อย่างไร
Mads Skjern

ใช่ฉันเห็นสิ่งนี้บน Ubuntu ของฉันด้วย แต่มันไม่ควรเกิดขึ้นในทางทฤษฎี ฉันไม่เข้าใจว่าทำไม
Daniel Pinyol

1
@MadsSkjern เพราะคุณไม่สามารถป้อนข้อมูลใด ๆ ลงในสคริปต์โดยใช้วิธีนี้
เคนชาร์ป

1
@MadsSkjern เหตุผลคือถ้าคุณเรียกใช้กระบวนการเช่นนี้ด้วย&ถ้าคุณออกจากระบบและเข้าสู่เซสชัน SSH ของคุณกระบวนการจะยังคงทำงานอยู่แต่คุณจะไม่สามารถเห็นผลลัพธ์ของกระบวนการนั้น (ถ้าสคริปต์ของคุณสะท้อนบางสิ่งที่คุณทำ จะไม่เห็นมัน แต่ถ้ามันเขียนไฟล์ไฟล์จะอยู่ที่นั่น)
DarkCygnus

4

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

วิธีใช้ :

  • ใช้คำสั่งscreenสำหรับการเริ่มต้นแรกเลื่อนดูข้อความแนะนำคุณควรจะมอบเครื่อง
  • Ca Cc เปิดเทอร์มินัลอื่น
  • Ca Ck ฆ่า terminal
  • คุณสามารถใช้ Ca C-Space และ Ca C-Backspace เพื่อวนผ่านเทอร์มินัล
  • Ca Ca มีประโยชน์ถ้าคุณใช้ขั้วสองขั้วเป็นส่วนใหญ่เท่านั้น
  • Ca Cd แยกเซสชั่นหน้าจอปัจจุบันและออกจากหน้าจอ จากนั้นคุณสามารถใช้screen -rเพื่อดำเนินการต่อเซสชันนั้น คุณสามารถมีหน้าจอที่แยกออกหลายครั้งพร้อมกันในกรณีนี้คุณจะแสดงรายการเซสชันที่มีให้

มีตัวเลือกอื่น ๆ อีกมากมายตัวอย่างเช่นหน้าจอแยกและปุ่มลัดทั้งหมดสามารถปรับแต่งได้อย่างเต็มที่


3

คำตอบที่ง่ายที่สุด ...

ctrl + z จะระงับโปรแกรมที่กำลังรันอยู่

"bg" จะทำงานในพื้นหลัง


5
โดยไม่ต้องปฏิเสธกระบวนการ (มีลักษณะคล้ายdisownหรือnohup) สิ่งนี้มักจะไม่ทำให้กระบวนการทำงานต่อหลังจากสิ้นสุดเซสชัน SSH
Eliah Kagan

3
บนเซิร์ฟเวอร์ Ubuntu ของฉันด้วยการตั้งค่าเริ่มต้นมันจะทำงานต่อไปจริงๆ
Mads Skjern

3

&วิธีที่ง่ายที่สุดคือการใช้คำสั่งของคุณในพื้นหลังที่มี จากนั้นเพียงแค่เขียน:

disown -a

0

ในขณะที่ทุกคนบอกว่าจะใช้disown(ตัวเลือกเดียวที่คุณมีหลังจากที่คุณเริ่มกระบวนการแล้ว) nohupหรือแม้แต่เรียกใช้คำสั่งscreenซึ่งมีประโยชน์ถ้าคุณต้องการเห็นผลลัพธ์ทั้งหมดจากคำสั่ง ... ฉันเป็นแฟนของscreen.. ฉันยังคงได้ลองลีนุกซ์รุ่นล่าสุดและวางงานในพื้นหลังและการเลิกไม่ได้ทำให้กระบวนการทั้งหมดที่กำลังจะตาย จะต้องมีการตั้งค่าระดับโลกหรือบางสิ่งบางอย่าง ฉันพยายามทำสิ่งนี้ในระบบเก่า ๆ (slackware 12) และสคริปต์ทดสอบของฉันยังคงทำงานต่อไปจนกว่าฉันจะฆ่ามันด้วยตนเอง:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

ในขณะที่ฉันยอมรับว่าscreenจะเป็นวิธีที่ดีที่สุดในการเรียกใช้แม้ว่าสคริปต์ของฉันจะเขียนลงในไฟล์บันทึกหรืออะไรก็ตาม .. ฉันไม่จำเป็นต้องใช้disown -a หรือnohupยกเว้นว่ามันจะหมดความหวาดระแวง บางทีใครบางคนสามารถหลั่งน้ำตาแสงในวิธีทุบตีพฤติกรรมตามค่าเริ่มต้น? อาจผู้ดูแลระบบบางคนเปลี่ยนค่าเริ่มต้นบนเชลล์ขนาดใหญ่เพื่อป้องกันไม่ให้กระบวนการของผู้ใช้ทำงานหนักเกินไป?


หากคุณมีข้อซักถามเพิ่มเติมโปรดถามคำถามใหม่
heemayl

0

น่าเสียดายที่เซสชัน SSH ที่ถูกยกเลิกสามารถส่งผลให้ tmux หรือหน้าจอถูกฆ่า นี่เป็นเพราะsystemdจะยุติกระบวนการลูกใด ๆ เมื่อออกจากระบบเซสชั่น

คุณสามารถเปลี่ยนการตั้งค่านี้ในlogind.conf( /etc/systemd/logind.conf) ของคุณ:

KillUserProcesses=no

ขอบคุณที่จะตอบในhttps://unix.stackexchange.com/questions/490267


-1

แทน :

cmd options; 

เพิ่มก่อนnohup:

nohup cmd options & 

จากนั้นคุณจะสามารถเห็นคอนโซล stdout โดย:

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