ฉันกำลังจะเรียกใช้สคริปต์หลามบน 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
อีกครั้งและคุณจะกลับมาที่จุดเริ่มต้น
disown
2.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
ตรวจสอบ