สมมติว่าฉันเปิดใช้กระบวนการจำนวนมากจากเซสชัน ssh เป็นไปได้ที่จะยกเลิกเซสชัน ssh ในขณะที่ยังคงกระบวนการเหล่านั้นทำงานบนเครื่องระยะไกล?
สมมติว่าฉันเปิดใช้กระบวนการจำนวนมากจากเซสชัน ssh เป็นไปได้ที่จะยกเลิกเซสชัน ssh ในขณะที่ยังคงกระบวนการเหล่านั้นทำงานบนเครื่องระยะไกล?
คำตอบ:
tmux
คุณควรมองหาทางเลือกที่ทันสมัยเช่น
tmux
เหนือกว่าscreen
ด้วยหลายเหตุผลนี่เป็นเพียงตัวอย่าง:
ในการรับฟังก์ชั่นเดียวกับที่อธิบายไว้ในคำตอบที่แนะนำscreen
คุณจะต้องทำสิ่งต่อไปนี้:
tmux
ด้วยการพิมพ์tmux
ลงในเปลือกtmux
เซสชั่นเริ่มต้นtmux
เซสชันโดยพิมพ์Ctrl+ bแล้วd ขณะนี้คุณสามารถได้อย่างปลอดภัยออกจากระบบเครื่องระยะไกล, tmux
กระบวนการของคุณจะยังคงทำงานอยู่ภายใน เมื่อคุณกลับมาอีกครั้งและต้องการตรวจสอบสถานะของกระบวนการของคุณคุณสามารถใช้tmux attach
เพื่อแนบกับtmux
เซสชันของคุณ
หากคุณต้องการที่จะมีการประชุมทำงานหลายด้านโดยด้านที่คุณควรตั้งชื่อแต่ละเซสชั่นการใช้Ctrl+ และb $
คุณจะได้รับรายชื่อของการประชุมที่กำลังทำงานอยู่โดยใช้ตอนนี้แนบไปกับเซสชั่นการทำงานที่มีคำสั่งtmux list-sessions
tmux attach-session -t 0
tmux
สามารถทำสิ่งขั้นสูงมากกว่าจัดการหน้าต่างเดียวในเซสชันเดียว สำหรับข้อมูลเพิ่มเติมดูได้ในman tmux
หรือtmux หน้า โดยเฉพาะอย่างยิ่งนี่คือคำถามที่พบบ่อยเกี่ยวกับความแตกต่างที่สำคัญระหว่างและscreen
tmux
screen -x -r [screenname]
หรือscreen -rx
ย่อหากคุณมีเซสชันหน้าจอเดียวที่ใช้งานอยู่ สิ่งนี้อนุญาตให้คุณแนบอินสแตนซ์ของหน้าจอที่มีอยู่
Ctrl-b
แล้วจึงd
จะออก / ถอดtmux
เซสชัน แน่นอนว่าเป็นกรณีสำหรับเวอร์ชั่นของtmux
Ubuntu 12.04 ของฉัน
tmux detach
แทนการพิมพ์ctrl-b d
nohup
วิธีที่ดีที่สุดมักจะง่ายที่สุด
nohup long-running-command &
มันถูกสร้างขึ้นมาโดยเฉพาะสำหรับการนี้ก็ยังบันทึก stdout nohup.log
ไป
man nohup
bg
หากคุณต้องการ "แบ็คกราวน์" บางงานที่กำลังดำเนินการอยู่ดังนั้นทางออกที่ดีที่สุดของคุณคือCtrl+ Zแล้วเรียกใช้
bg
เพื่อทำให้งานที่ถูกระงับล่าสุดของคุณกลับมาเป็นแบ็คกราวด์
จากนั้นอย่างรวดเร็วdisown
ควรให้กระบวนการทำงานหลังจากที่คุณออกจากระบบ
screen
และคนอื่นสามารถทำได้ แต่นั่นไม่ใช่สิ่งที่พวกเขาทำ ฉันแนะนำnohup
สำหรับงานที่คุณรู้ว่าจะทิ้งไว้ข้างหลังและbg
ทำงานที่ทำไปแล้วและไม่ต้องการเริ่มต้นใหม่
โปรดจำไว้ว่าทั้งสองเป็นทุบตีเฉพาะ หากคุณไม่ได้ใช้ bash คำสั่งอาจแตกต่างกัน
disown -h
bg
+ disown
ไม่ทำงานสำหรับฉัน ฉันมีสคริปต์การปรับใช้ที่ใช้งานอยู่ฉันลืมที่จะเริ่มต้นภายใน tmux และต้องออกจากการประชุมก่อน สคริปต์ส่งออกความคืบหน้าไปยังเชลล์อย่างต่อเนื่อง ctrl+z
หยุดกระบวนการส่งคืนฉันไปทุบตี bg
กลับสู่กระบวนการทำงานต่อ แต่ก็กลับมาแสดงสถานะเป็นทุบตีอีกครั้งทำให้ไม่สามารถเห็นสิ่งที่ฉันพิมพ์ได้ อย่างไรก็ตามdisown
คำสั่งสร้าง "ปฏิเสธ: ปัจจุบัน: ไม่มีงานดังกล่าว"
julia myFile.jl
เหตุผลใดก็ตาม tmux ทำและยอดเยี่ยม
screen
คุณสามารถดำเนินการได้โดยใช้
พิมพ์man screen
เพื่อหาข้อมูลเพิ่มเติมหรืออ่านหน้าคนหน้าจอ
สถานการณ์ง่าย ๆ :
ssh ลงในกล่องรีโมตของคุณ พิมพ์screen
จากนั้นเริ่มกระบวนการที่คุณต้องการ
กดCtrl- Aแล้ว-Ctrl Dนี่จะเป็นการ "แยก" เซสชั่นหน้าจอของคุณ แต่ปล่อยให้กระบวนการทำงาน ตอนนี้คุณสามารถออกจากระบบของกล่องระยะไกล
ถ้าคุณต้องการที่จะกลับมาในภายหลังให้เข้าสู่ระบบอีกครั้งและพิมพ์screen -r
สิ่งนี้จะ "ดำเนินการ" เซสชั่นหน้าจอของคุณและคุณสามารถเห็นผลลัพธ์ของกระบวนการของคุณ
screen -S name
เพื่อให้ง่ายต่อการเชื่อมต่อกับสิ่งที่ถูกต้องในภายหลัง
screen -S
ก่อนออกเดินทางและscreen -r
เมื่อกลับมาเป็นที่น่าอัศจรรย์!
Screen และ nohup เป็นวิธีที่ดีกว่า แต่ถ้าคุณต้องแยกกระบวนการที่กำลังทำงานอยู่โดยไม่มีหน้าจอหรือ nohup คุณสามารถเรียกใช้คำสั่ง disown
disown [-ar] [-h] [
jobspec
… |
pid
… ]
หากไม่มีตัวเลือกให้ลบjobpecแต่ละอันออกจากตารางงานที่กำลังทำงานอยู่ หากได้รับ
-h
ตัวเลือกงานจะไม่ถูกลบออกจากตาราง แต่จะถูกทำเครื่องหมายเพื่อไม่ให้ SIGHUP ส่งไปยังงานหากเชลล์ได้รับ SIGHUP หากjobspecไม่มีอยู่และไม่จัดหา-a
หรือไม่มี-r
ตัวเลือกงานปัจจุบันจะถูกใช้ ถ้าไม่มีjobspecจะถูกส่งไปที่-a
ตัวเลือกหมายความว่าจะลบหรือทำเครื่องหมายงานทั้งหมด;-r
ตัวเลือกโดยไม่ต้องjobspecอาร์กิวเมนต์ จำกัด การดำเนินงานการทำงาน
ด้วยการปฏิเสธคุณสามารถปิดเครื่องและทำให้กระบวนการทำงานบนเครื่องได้
disown -a && exit
disown
และมันฆ่ามัน
ฉันติดอยู่ใน mv ขนาดใหญ่ดังนั้นฉันจึงไม่สามารถหยุดกระบวนการหน้าจอตั้งค่าแล้วเริ่มใหม่อีกครั้ง ฉันจัดการเพื่อออกจากเซสชัน ssh ด้วยกระบวนการทำงานโดยทำตามขั้นตอนต่อไปนี้:
ขั้นตอนที่ 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.
disown
งานคำสั่งในตัวจะทำงานกับงานแบ็กกราวน์ล่าสุด
มีโปรแกรมหลักสองโปรแกรมที่คุณสามารถใช้เพื่อบำรุงรักษาโปรแกรมและสถานะเทอร์มินัลผ่านการเชื่อมต่อหลาย ssh พวกเขาเป็นหน้าจอ (ผู้ดำรงตำแหน่ง แต่น่าเสียดายที่ไม่มีใครสนใจเห็นได้ชัดว่ามีการพัฒนาอย่างแข็งขันในขณะนี้ ) และ tmux (ใหม่กว่าได้รับการบำรุงรักษาอย่างแข็งขัน) Byobu เป็นส่วนหน้าที่สามารถทำงานบนระบบเหล่านี้และให้ข้อมูลสถานะอูบุนตูเพิ่มเติม ในการติดตั้งใหม่มันจะใช้ tmux เป็นแบ็กเอนด์ถ้าคุณมีการติดตั้งเก่าของ byobu และการตั้งค่าที่มีอยู่มันจะรักษาแบ็กเอนด์ก่อนหน้าไม่ว่าจะเป็นหน้าจอหรือ tmux
Byobu สามารถติดตั้งบนคอมพิวเตอร์ได้โดยทำในเครื่องที่ใช้ Debian:
sudo aptitude install byobu
ใช้ yum คุณทำ
su -c 'yum install byobu'
นอกจากนี้ยังสามารถติดตั้ง byobu ในดิสทริบิวชันอื่น ๆ ได้
คุณสามารถเริ่มต้น byobu โดยเรียกใช้byobu
บนเครื่องโฮสต์หลังจากเชื่อมต่อโดยใช้ ssh นี่จะให้เชลล์ที่มีหน้าตาแบบนี้:
คุณยังสามารถใช้ Byobu Terminal บนเครื่อง Ubuntu พร้อมตัวเลือก -X และใช้งาน byobu ได้อย่างสมบูรณ์แบบ
เริ่ม byobu byobu
โดยการพิมพ์
คุณสามารถกด F2 เพื่อสร้างหน้าต่างใหม่ภายในเซสชันปัจจุบัน F3-F4 เพื่อสลับระหว่างหน้าต่างต่างๆ
ส่วนที่ดีที่สุดเกี่ยวกับ byobu คือคุณไม่จำเป็นต้องฆ่ากระบวนการที่เรียกใช้ในเทอร์มินัลเพื่อออกจากเทอร์มินัล คุณสามารถส่งหน้าจอ / tmux (โครงกระดูกของ byobu) ไปยังพื้นหลังและดำเนินการต่อในครั้งต่อไปที่คุณมา:
ครั้งต่อไปที่คุณมาก็แค่ทำbyobu
แล้วคุณจะกลับมาที่เดิม
คุณยังสามารถสร้างเซสชัน byobu ที่หลากหลายได้byobu -S session1
เช่นกัน และคุณสามารถเชื่อมต่อกับพวกเขาเมื่อคุณกลับมา
คุณสามารถทำได้มากขึ้นโดยใช้ Byobu ใช้มัน! บางคำแนะนำที่ชัดเจนอยู่ที่นี่หรือที่นี่
คุณไม่สามารถทำสิ่งนี้ได้เมื่อกระบวนการเริ่มต้นขึ้นคุณจะต้องจัดเตรียมสิ่งต่าง ๆ ก่อนที่คุณจะทำงานที่ยาวนาน
คุณสามารถใช้nohupแต่ภูมิปัญญาที่ทันสมัยแนะนำให้คุณใช้หน้าจอหรือ byobu เป็นข้อมูลเข้าสู่ระบบของคุณเพื่อให้คุณสามารถแยกและออกจากสิ่งที่ทำงาน
หน้าจอมีข้อได้เปรียบที่คุณสามารถแยกออกจากเครื่องหนึ่งและติดตั้งใหม่จากอีกเครื่องหนึ่งซึ่งมีประโยชน์หากคุณต้องการตรวจสอบกระบวนการที่ใช้เวลานานซึ่งทำงานเกินกว่าสิ้นสุดวันทำงาน
มีคู่มือเริ่มต้นใช้งานที่เหมาะสมในการคัดกรองหน้าจอที่นี่
byobuทำให้การใช้อินเตอร์เฟซบนหน้าจอเป็นเรื่องง่ายด้วยเมนูและอื่น ๆ นอกจากนี้ยังเป็นการนำหน้าจอปัจจุบันไปใช้กับ Ubuntu รุ่นใหม่ F2 เพื่อเริ่มต้นเทอร์มินัลใหม่ F3 / F4 เพื่อสลับไปมาและ F6 เพื่อยกเลิกการเชื่อมต่อ พิมพ์ exit เพื่อสิ้นสุดเทอร์มินัลอย่างถาวร
disown
เพื่อให้บรรลุสิ่งนี้ ดูคำตอบ @ bassgey ของ
disown
และหากมีความจำเป็นเพียงCtrl-z
แล้วbg
จะได้รับมันของอาคารที่ใช้งานและพื้นหลัง จากนั้นdisown
.
เฮ้ในขณะที่ฉันตกลงว่าหน้าจอเป็นตัวเลือกที่มีประสิทธิภาพที่สุด คุณสามารถใช้ vncserver แล้วเริ่มกระบวนการ
นอกจากนี้ถ้าสิ่งที่คุณสนใจเพียงอย่างเดียวคือให้กระบวนการทำงานและไม่จำเป็นต้องควบคุมมันและสิ่งที่สำคัญที่สุดที่คุณไม่ทราบคุณจะต้องปิดเซสชันและคุณมีกระบวนการทำงานอยู่แล้วคุณไม่โชคดีถ้า คุณใช้ทุบตีเป็นเปลือก
ขั้นแรกคุณต้องส่งกระบวนการไปที่พื้นหลังโดยพิมพ์ Ctrl + Z ตามด้วย bg% 1 (จำนวนขึ้นอยู่กับหมายเลขงานโดยปกติคือ 1 แต่คุณสามารถดึงรายการโดยใช้งานคำสั่งได้อย่างง่ายดาย)
ในที่สุดเรียกใช้คำสั่งปฏิเสธ (ตามด้วย jobid ... เช่นเดียวกับคำสั่ง bg)
สิ่งนี้จะลบความสัมพันธ์พาเรนต์ - ลูกระหว่างเชลล์ของคุณและกระบวนการในพื้นหลังเพื่อป้องกันไม่ให้ตายเมื่อเชลล์ของคุณถูกยกเลิก
screen
คำถามที่ถูกวางเหตุการณ์หลังการเข้าสู่ระบบวิธีการให้กระบวนการทำงานตอนนี้หลังจากเข้าสู่ระบบ แต่ก่อนที่จะเริ่มพวกเขา คำตอบที่ดี Jorge คุณช่วยฉันจริงๆ! :)
bg
(โดยไม่%1
) มักจะเพียงพอเนื่องจากค่าเริ่มต้นคืองานปัจจุบัน
สำหรับเชลล์สคริปต์เดียวที่ฉันใช้เป็นเวลานานฉันจะเข้าสู่ระบบและรันกระบวนการในพื้นหลังโดยใช้ '&'
ตัวอย่าง:
/path/to/my/script &
ฉันออกจากระบบและยกเลิกการเชื่อมต่อเซสชัน SSH ของฉันแล้ว เมื่อฉันเข้าสู่ระบบในภายหลังสคริปต์ยังคงดำเนินการตามที่พิสูจน์โดยการรวบรวมข้อมูลอย่างต่อเนื่องจากสคริปต์
&
ถ้าคุณออกจากระบบและเข้าสู่เซสชัน SSH ของคุณกระบวนการจะยังคงทำงานอยู่แต่คุณจะไม่สามารถเห็นผลลัพธ์ของกระบวนการนั้น (ถ้าสคริปต์ของคุณสะท้อนบางสิ่งที่คุณทำ จะไม่เห็นมัน แต่ถ้ามันเขียนไฟล์ไฟล์จะอยู่ที่นั่น)
คุณควรตรวจสอบหน้าจอ GNUและดูว่ามันช่วยคุณได้หรือไม่ ขึ้นอยู่กับว่าคุณต้องการให้แอปพลิเคชันทำงานอย่างไรในแบบเรียลไทม์อาจทำให้เกิดปัญหามากกว่าที่แอปพลิเคชั่นจะแก้ไข
วิธีใช้ :
screen
สำหรับการเริ่มต้นแรกเลื่อนดูข้อความแนะนำคุณควรจะมอบเครื่องscreen -r
เพื่อดำเนินการต่อเซสชันนั้น คุณสามารถมีหน้าจอที่แยกออกหลายครั้งพร้อมกันในกรณีนี้คุณจะแสดงรายการเซสชันที่มีให้มีตัวเลือกอื่น ๆ อีกมากมายตัวอย่างเช่นหน้าจอแยกและปุ่มลัดทั้งหมดสามารถปรับแต่งได้อย่างเต็มที่
คำตอบที่ง่ายที่สุด ...
ctrl + z จะระงับโปรแกรมที่กำลังรันอยู่
"bg" จะทำงานในพื้นหลัง
disown
หรือnohup
) สิ่งนี้มักจะไม่ทำให้กระบวนการทำงานต่อหลังจากสิ้นสุดเซสชัน SSH
&
วิธีที่ง่ายที่สุดคือการใช้คำสั่งของคุณในพื้นหลังที่มี จากนั้นเพียงแค่เขียน:
disown -a
ในขณะที่ทุกคนบอกว่าจะใช้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
ยกเว้นว่ามันจะหมดความหวาดระแวง บางทีใครบางคนสามารถหลั่งน้ำตาแสงในวิธีทุบตีพฤติกรรมตามค่าเริ่มต้น? อาจผู้ดูแลระบบบางคนเปลี่ยนค่าเริ่มต้นบนเชลล์ขนาดใหญ่เพื่อป้องกันไม่ให้กระบวนการของผู้ใช้ทำงานหนักเกินไป?
น่าเสียดายที่เซสชัน SSH ที่ถูกยกเลิกสามารถส่งผลให้ tmux หรือหน้าจอถูกฆ่า นี่เป็นเพราะsystemd
จะยุติกระบวนการลูกใด ๆ เมื่อออกจากระบบเซสชั่น
คุณสามารถเปลี่ยนการตั้งค่านี้ในlogind.conf
( /etc/systemd/logind.conf
) ของคุณ:
KillUserProcesses=no
ขอบคุณที่จะตอบในhttps://unix.stackexchange.com/questions/490267
แทน :
cmd options;
เพิ่มก่อนnohup
:
nohup cmd options &
จากนั้นคุณจะสามารถเห็นคอนโซล stdout โดย:
tail -f nohup.out