macunu kapattığımda bir python betiği nasıl çalışır


19

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.


1
Kontrol edin nohup.
phk

Yanıtlar:


36

İki ana seçeneğiniz var:

  1. 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.outyeniden yönlendirmediğiniz sürece ( nohup pythonScript.py > outfile) çağrılmış bir dosyaya ekleneceğini unutmayın .

  2. Gibi bir ekran çoklayıcı kullanın tmux. Bu, uzak makineyle bağlantıyı kesmenize izin verir, ancak daha sonra tmux attachtekrar 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 attachve başladığınız yere geri döndünüz.


4
1 & 2 alternatifleri: 1. disown2.screen
heemayl

Ayrıca byobukayda değer olabilir , tmux veya ekranın etrafındaki bir ambalaj.
bli

2

screenBütün Linux dağıtımlarının için kullanılabilir bir araç, bu destekler.

Yüklemek apt-get install screeniçin deb tabanlı Linux dağıtımları dnf install -y screenveya yum install -y screenRPM 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


Varsayılan yapılandırmasında screentam 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
Fox

1

Ç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 . systemdVarsayı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=ve KillExcludeUsers=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-lingerolarak loginctl(1).

Oturum kapsamının dışına taşınmadıkça , ayarın (1) ve (1) KillUserProcesses=yesgibi araçları kıracağını unutmayın . (1) ' deki örneğe bakınız .screentmuxsystemd-run

Daha fazla bilgi için bağlantılı cevabı okuyun.


1
Bu, işlemi arka plana gönderir. OP uzak bir ssh oturumuyla bağlantıyı kesmek ve işlemin devam etmesini istiyor. Bu, bu durumda yardımcı olmaz, uzak oturumdan çıkmak, arka planda olsa bile komutu durduracaktır.
terdon

@terdon örneğimin çalışıp çalışmadığını kontrol ettin mi? Kontrol ettim ve cevabımda yazdığım gibi bazı komutlar için çalışıyor .
strafor sinek

Evet, kontrol ettim ve evet, bazen komutun devam ettiğini gördüm. Ancak, hangi komutların devam ettiğini tam olarak açıklayamadıkça veya devam edip etmeyeceğini önceden bilmenin bir yolunu sunmadıkça, komutun durduğunu çok sık gördüm, bu çok yararlı değil. Aslında, verdiğiniz belirli bir örnek, Arch'ımdan uzak bir Ubuntu sistemine bağlandığım bir testte başarısız oldu.
terdon

@terdon funny, bunu uzaktan PLD'ye bağlanan yerel ArchLinux'da kontrol ettim. Her zaman çalışan tek kural "program kullanmıyor isatty()ve kullanılmıyorsa ?"
strafor sinek

Bu kendi sorusunu hak edebilir. Eskiden nohup'a ihtiyacım olduğunu biliyorum, ve sonra bir noktada bir şeyler değişti ve bazen de değişmedim. Isatty'nin nasıl olabileceğini göremiyorum, eğer ebeveyn kabuğundan çıkarsanız, bu da çocuğu öldürmelidir. Ama evet, bazen değil. Bir şekilde yapılandırılabilir olması gerektiğini tahmin ediyorum.
terdon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.