ฉันกำลังจะเรียกใช้สคริปต์หลามบน Ubuntu บน VPS มันเป็นกระบวนการฝึกอบรมการเรียนรู้ด้วยเครื่องดังนั้นใช้เวลามากในการฝึกอบรม ฉันจะปิด putty โดยไม่หยุดกระบวนการนั้นได้อย่างไร
ฉันกำลังจะเรียกใช้สคริปต์หลามบน Ubuntu บน VPS มันเป็นกระบวนการฝึกอบรมการเรียนรู้ด้วยเครื่องดังนั้นใช้เวลามากในการฝึกอบรม ฉันจะปิด putty โดยไม่หยุดกระบวนการนั้นได้อย่างไร
คำตอบ:
คุณมีสองตัวเลือกหลัก:
nohupเรียกใช้คำสั่งด้วย การดำเนินการนี้จะยกเลิกการเชื่อมโยงจากเซสชันของคุณและปล่อยให้มันทำงานต่อไปหลังจากที่คุณยกเลิกการเชื่อมต่อ:
nohup pythonScript.py
โปรดทราบว่า stdout ของคำสั่งจะถูกผนวกเข้ากับไฟล์ชื่อnohup.outเว้นแต่คุณจะเปลี่ยนเส้นทาง ( nohup pythonScript.py > outfile)
ใช้ Multiplexer tmuxหน้าจอเช่น สิ่งนี้จะช่วยให้คุณตัดการเชื่อมต่อจากเครื่องระยะไกล แต่จากนั้นในครั้งต่อไปที่คุณเชื่อมต่อหากคุณทำงานtmux attachอีกครั้งคุณจะพบว่าตัวเองอยู่ในเซสชันเดียวกัน คำสั่งจะยังคงทำงานอยู่ (คำสั่งจะยังคงทำงานต่อเมื่อคุณออกจากระบบ) และคุณจะสามารถดู stdout และ stderr ของมันได้ราวกับว่าคุณไม่ได้ออกจากระบบ:
tmux
pythonScript.py
เมื่อคุณเปิดตัวแล้วให้ปิดหน้าต่าง PuTTY จากนั้นเชื่อมต่ออีกครั้งในวันถัดไปทำงานtmux attachอีกครั้งและคุณจะกลับมาที่จุดเริ่มต้น
disown2.screen
byobuเสื้อคลุมรอบ tmux หรือหน้าจอ
screenเครื่องมือพร้อมใช้งานสำหรับลินุกซ์ distros ทั้งหมดสนับสนุนนี้
หากต้องการติดตั้งให้รันapt-get install screenสำหรับ distros Linux ที่ใช้deb
dnf install -y screenหรือyum install -y screenสำหรับ RPM ที่ใช้พื้นฐาน
ใช้:
$ screen
เริ่มเชลล์ใหม่ ในเชลล์นี้คุณสามารถเริ่มต้นสคริปต์ Python ของคุณ จากนั้นคุณสามารถกดCtrl+ Shift+ แล้วA Dมันจะแยกขั้วของคุณจากเปลือกที่ใช้สคริปต์ของคุณ นอกจากนี้สคริปต์ยังคงทำงานอยู่
screen -rเพื่อดูว่าสคริปต์ของคุณทำงานคุณสามารถโทรหา สิ่งนี้จะแนบเทอร์มินัลของคุณเข้ากับเชลล์อีกครั้งด้วยสคริปต์ Python ที่คุณปล่อยให้ทำงานอยู่เบื้องหลัง
UPD: ฟ็อกซ์กล่าวถึงหน้าจอการทำงานที่ไม่ดีกับ systemd แต่เราสามารถใช้ systemd ที่จะเริ่มต้นสคริปต์เช่นที่พวกเขากล่าวว่าในตัวอย่างเป็นทางการ
ตัวอย่างเช่นหากสคริปต์ของคุณเริ่มต้นโดย/usr/bin/myPythonScriptคุณสามารถสร้างไฟล์หน่วย Systemd เช่นนี้
$ cat /etc/systemd/system/myPythonScript.service
[Unit]
Description=MyPythonScript
[Service]
ExecStart=/usr/bin/myPythonScript
[Install]
WantedBy=multi-user.target
กว่าคุณสามารถเริ่มต้นสคริปต์นี้
# systemctl daemon-reload
# systemctl start myPythonScript
หากคุณต้องการให้สคริปต์นี้เริ่มต้นโดยอัตโนมัติเมื่อระบบเริ่ม -
# systemctl enable myPythonScript
เมื่อใดก็ตามที่คุณสามารถดูว่าสคริปต์ทำงานอย่างไร
# systemctl status myPythonScript
โฆษณาที่คุณสามารถตรวจสอบบันทึกของสคริปต์ของคุณ
# journalctl -u myPythonScript -e
screenว่าไม่ได้เล่นอย่างแน่นอนsystemdในการกำหนดค่าเริ่มต้น ฉันไม่รู้ว่า Ubuntu ใช้systemdหรือไม่ แต่พฤติกรรมและวิธีแก้ปัญหาอาจคุ้มค่าที่จะกล่าวถึงในคำตอบของคุณ
กระบวนการส่วนใหญ่สามารถถูกหลอกได้ด้วยการเปลี่ยนเส้นทาง stdout, stderr, stdin (ไม่ใช่ descriptors ทั้งหมดที่จำเป็นต้องเปลี่ยนเส้นทางเสมอ) และใช้&โอเปอเรเตอร์ควบคุม
เห็นว่าping example.com 1>/dev/null &ทำงาน
แน่นอนว่าบางโปรแกรมมีความซับซ้อนและต้องการวิธีแก้ปัญหาตามที่ @terdon กล่าวถึง แต่ก็เป็นการดีที่จะรู้และใช้สิ่งที่เหมาะสมที่สุด
แก้ไข: ดังที่เขียนไว้ในคำตอบนี้จะฆ่าsystemdกระบวนการในการออกจากระบบ systemdกระบวนการฆ่าบางรุ่นในการออกจากระบบโดยค่าเริ่มต้นกระบวนการอื่นไม่ทำ พฤติกรรมนี้สามารถเปลี่ยนแปลงได้โดยการแก้ไข /etc/systemd/logind.conf โดยการตั้งค่าตัวเลือกต่อไปนี้ ตามที่เขียนไว้มันอาจแก้ปัญหาบางอย่างที่คุณอาจมีกับโซลูชันของ @ terdon
จากman logind.conf:
KillUserProcesses=รับอาร์กิวเมนต์บูลีน กำหนดว่าควรฆ่ากระบวนการของผู้ใช้เมื่อผู้ใช้ออกจากระบบหรือไม่ หากเป็นจริงหน่วยขอบเขตที่สอดคล้องกับเซสชันและกระบวนการทั้งหมดภายในขอบเขตนั้นจะถูกยกเลิก หากเป็นเท็จขอบเขตคือ "ละทิ้ง" ดูที่ systemd.scope (5) และกระบวนการจะไม่ถูกทำลาย เริ่มต้นที่ "ใช่" แต่ดูตัวเลือก
KillOnlyUsers=และKillExcludeUsers=ด้านล่างนอกเหนือจากกระบวนการเซสชันกระบวนการผู้ใช้อาจทำงานภายใต้หน่วยจัดการผู้ใช้ user @ .service ขึ้นอยู่กับการตั้งค่าอิทธิพลนี้อาจช่วยให้ผู้ใช้เรียกใช้กระบวนการที่เป็นอิสระจากช่วงการเข้าสู่ระบบของพวกเขา ดูคำอธิบายของ
enable-lingerในloginctl(1)โปรดทราบว่าการตั้งค่า
KillUserProcesses=yesจะทำลายเครื่องมือเช่นscreen(1) และtmux(1) เว้นแต่ว่าพวกเขาจะถูกย้ายออกจากขอบเขตเซสชัน ดูตัวอย่างในsystemd-run(1)
อ่านคำตอบที่เชื่อมโยงเพื่อหาข้อมูลเพิ่มเติม
isatty()และออกจากโปรแกรมหรือไม่หากไม่ใช่"
nohupตรวจสอบ