VPS'de Ubuntu'da bir python betiği çalıştırmak üzereyim. Makine öğrenimi eğitim sürecidir, bu yüzden eğitmek için büyük zaman ayırın. Bu işlemi durdurmadan macunu nasıl kapatabilirim.
VPS'de Ubuntu'da bir python betiği çalıştırmak üzereyim. Makine öğrenimi eğitim sürecidir, bu yüzden eğitmek için büyük zaman ayırın. Bu işlemi durdurmadan macunu nasıl kapatabilirim.
Yanıtlar:
İki ana seçeneğiniz var:
Komutu ile çalıştırın nohup
. Bu işlem oturumunuzla olan ilişkisini keser ve bağlantıyı kestikten sonra yayınlanmaya devam eder:
nohup pythonScript.py
Komutun stdout'unun, nohup.out
yeniden yönlendirmediğiniz sürece ( nohup pythonScript.py > outfile
) çağrılmış bir dosyaya ekleneceğini unutmayın .
Gibi bir ekran çoklayıcı kullanın tmux
. Bu, uzak makineyle bağlantıyı kesmenize izin verir, ancak daha sonra tmux attach
tekrar bağlandığınızda, tekrar çalışırsanız, kendinizi tamamen aynı oturumda bulacaksınız. Komut yine de çalışıyor olacak (oturumu kapattığınızda çalışmaya devam edecek) ve stdout ve stderr'i hiç çıkış yapmadığınız gibi görebileceksiniz:
tmux
pythonScript.py
Bunu başlattıktan sonra, PuTTY penceresini kapatın. Ardından, ertesi gün tekrar bağlanın, tekrar çalıştırın tmux attach
ve başladığınız yere geri döndünüz.
disown
2.screen
byobu
kayda değer olabilir , tmux veya ekranın etrafındaki bir ambalaj.
screen
Bütün Linux dağıtımlarının için kullanılabilir bir araç, bu destekler.
Yüklemek apt-get install screen
için deb tabanlı Linux dağıtımları
dnf install -y screen
veya yum install -y screen
RPM tabanlı olanlar için çalıştırın.
Kullanmak:
$ screen
Yeni bir kabuk başlatılır. Bu kabukta Python komut dosyanızı başlatabilirsiniz. Ardından Ctrl+ Shift+ Asonra tuşuna basabilirsiniz D. Terminalinizi komut dosyanızı çalıştıran kabuktan ayırır. Ayrıca, betik hala içinde çalışıyor.
Komut dosyanızın nasıl çalıştığını görmek için arayabilirsiniz screen -r
. Bu, arka planda çalışmayı bıraktığınız Python betiği ile terminalinizi kabuğa yeniden bağlar.
UPD: Fox'un belirttiği gibi, ekran systemd ile kötü çalışıyor, ancak resmi örnekte söyledikleri gibi script'i başlatmak için systemd'yi kullanabiliriz .
Örneğin, komut dosyanız tarafından başlatılırsa /usr/bin/myPythonScript
, bunun gibi Systemd birim dosyası oluşturabilirsiniz.
$ cat /etc/systemd/system/myPythonScript.service
[Unit]
Description=MyPythonScript
[Service]
ExecStart=/usr/bin/myPythonScript
[Install]
WantedBy=multi-user.target
Daha sonra, bu komut dosyasını başlatabilirsiniz
# systemctl daemon-reload
# systemctl start myPythonScript
Bu komut dosyasının sistem başlangıcında otomatik olarak başlatılmasını istiyorsanız -
# systemctl enable myPythonScript
Komut dosyanızın nasıl çalıştığını her zaman görebilirsiniz
# systemctl status myPythonScript
Komut dosyanızın günlüklerini inceleyebileceğiniz reklam
# journalctl -u myPythonScript -e
screen
tam olarak iyi oynatılamadığını unutmayın systemd
. Ubuntu'nun kullanılıp kullanılmadığını bilmiyorum systemd
, ancak yanıtınızda davranış ve geçici çözüm belirtilmeye değer olabilir
Çoğu süreç, stdout, stderr, stdin'i yönlendirerek (yeniden tanımlamak için tüm tanımlayıcıların her zaman gerekli olmadığı) ve &
kontrol operatörünü kullanarak kandırılabilir .
Bakın bu ping example.com 1>/dev/null &
işi yapıyor.
Tabii ki, bazı programlar daha karmaşıktır ve @terdon'un bahsettiği gibi çözümler gerektirir, ancak en uygun olanı bilmek ve kullanmak iyidir.
EDIT: bu cevap yazıldığı gibi systemd
çıkış oturumları öldürür . systemd
Varsayılan olarak oturumu kapatmadaki kill işlemlerinin bazı sürümleri , diğerleri yoktur. Bu davranış, /etc/systemd/logind.conf değiştirilerek aşağıdaki seçenek ayarlanarak değiştirilebilir. Yazıldığı gibi, @ terdon'un çözümleriyle ilgili bazı sorunları da çözebilir.
from man logind.conf
:
KillUserProcesses=
Bir boole argümanı alır. Kullanıcı oturumu kapattığında kullanıcının işlemlerinin öldürülüp öldürülmeyeceğini yapılandırır. Değer doğruysa, oturuma karşılık gelen kapsam birimi ve bu kapsam içindeki tüm işlemler sonlandırılır. Yanlışsa, kapsam "terk edilir", bkz. Systemd.scope (5) ve işlemler öldürülmez. Varsayılan "evet", ama seçenekleri görmek
KillOnlyUsers=
veKillExcludeUsers=
aşağıda.Oturum işlemlerine ek olarak, kullanıcı işlemi kullanıcı @ .service kullanıcı yöneticisi birimi altında da çalışabilir. Oyalanma ayarlarına bağlı olarak bu, kullanıcıların oturum açma oturumlarından bağımsız olarak süreçleri çalıştırmasına izin verebilir. Açıklamasına bakınız
enable-linger
olarakloginctl
(1).Oturum kapsamının dışına taşınmadıkça , ayarın (1) ve (1)
KillUserProcesses=yes
gibi araçları kıracağını unutmayın . (1) ' deki örneğe bakınız .screen
tmux
systemd-run
Daha fazla bilgi için bağlantılı cevabı okuyun.
isatty()
ve kullanılmıyorsa ?"
nohup
.