cara membuat skrip python berjalan ketika saya menutup dempul
19
Saya akan menjalankan skrip python di Ubuntu di VPS. Ini adalah proses pelatihan pembelajaran mesin sehingga membutuhkan waktu yang sangat lama untuk berlatih. Bagaimana saya bisa menutup dempul tanpa menghentikan proses itu.
Jalankan perintah dengan nohup. Ini akan memisahkannya dari sesi Anda dan membiarkannya terus berjalan setelah Anda memutuskan koneksi:
nohup pythonScript.py
Perhatikan bahwa stdout dari perintah akan ditambahkan ke file yang dipanggil nohup.outkecuali Anda mengarahkan ulang ( nohup pythonScript.py > outfile).
Gunakan seperti multiplexer layar tmux. Ini akan memungkinkan Anda memutuskan sambungan dari mesin jarak jauh tetapi kemudian, lain kali Anda terhubung, jika Anda menjalankan tmux attachlagi, Anda akan menemukan diri Anda dalam sesi yang persis sama. Perintah masih akan berjalan (itu akan terus berjalan ketika Anda logout) dan Anda akan dapat melihat stdout dan stderr seolah-olah Anda tidak akan pernah logout:
tmux
pythonScript.py
Setelah Anda meluncurkannya, tutup saja jendela Putty. Kemudian, hubungkan lagi keesokan harinya, jalankan tmux attachlagi dan Anda kembali ke tempat Anda mulai.
Mungkin juga layak disebut byobu, pembungkus tmux atau layar.
bli
2
The screenalat, tersedia untuk semua distro Linux, mendukung ini.
Untuk menginstalnya, jalankan apt-get install screendistro Linux berbasis deb, atau
dnf install -y screenatau yang yum install -y screenberbasis RPM.
Menggunakan:
$ screen
Shell baru dimulai. Dalam shell ini, Anda dapat memulai skrip Python Anda. Kemudian Anda dapat menekan Ctrl+ Shift+ Alalu D. Ini akan melepaskan terminal Anda dari shell yang menjalankan skrip Anda. Selanjutnya, skrip masih berjalan di dalamnya.
Untuk melihat bagaimana skrip Anda berjalan, Anda dapat menelepon screen -r. Ini akan memasang kembali terminal Anda ke shell dengan skrip Python yang Anda jalankan di latar belakang.
UPD: seperti yang disebutkan Fox, layar berfungsi buruk dengan systemd, tetapi kita dapat menggunakan systemd untuk memulai skrip, seperti yang mereka katakan dalam contoh resmi .
Misalnya, jika skrip Anda dimulai oleh /usr/bin/myPythonScript, Anda dapat membuat file unit Systemd, seperti ini.
Perhatikan bahwa screentidak persis bermain dengan baik systemddalam konfigurasi default. Saya tidak tahu apakah Ubuntu menggunakan systemd, tetapi perilaku dan solusinya mungkin layak disebutkan dalam jawaban Anda
Fox
1
Sebagian besar proses dapat tertipu dengan mengarahkan stdout, stderr, stdin (tidak semua deskriptor selalu diperlukan untuk mengarahkan ulang) dan menggunakan &operator kontrol.
Lihat yang ping example.com 1>/dev/null &melakukan pekerjaan.
Tentu saja, beberapa program lebih canggih dan membutuhkan solusi seperti yang disebutkan @terdon, tetapi ada baiknya untuk mengetahui dan menggunakan yang terbaik.
EDIT: seperti yang tertulis dalam jawaban ini membunuh systemdproses saat logout. Beberapa versi systemdproses kill pada logout secara default, yang lain tidak. Perilaku ini dapat diubah dengan memodifikasi /etc/systemd/logind.conf dengan mengatur opsi berikut. Seperti yang tertulis, ini juga dapat memecahkan beberapa masalah yang Anda miliki dengan solusi @ terdon.
dari man logind.conf:
KillUserProcesses=
Membawa argumen boolean. Mengkonfigurasi apakah proses pengguna harus dibunuh saat pengguna keluar. Jika benar, unit lingkup yang sesuai dengan sesi dan semua proses di dalam lingkup itu akan diakhiri. Jika salah, ruang lingkup "ditinggalkan", lihat systemd.scope (5), dan proses tidak terbunuh. Standarnya adalah "ya", tetapi lihat opsi KillOnlyUsers=dan di KillExcludeUsers=bawah.
Selain proses sesi, proses pengguna dapat berjalan di bawah unit manajer pengguna pengguna @ .layanan. Bergantung pada pengaturan berlama-lama, ini memungkinkan pengguna untuk menjalankan proses terlepas dari sesi login mereka. Lihat deskripsi enable-lingerdalam loginctl(1).
Perhatikan bahwa pengaturan KillUserProcesses=yesakan merusak alat-alat seperti screen(1) dan tmux(1), kecuali mereka dipindahkan keluar dari ruang lingkup sesi. Lihat contoh di systemd-run(1).
Baca jawaban yang terhubung untuk mencari tahu lebih lanjut.
Ini hanya mengirim proses ke latar belakang. OP ingin dapat memutuskan sambungan dari sesi ssh jarak jauh dan melanjutkan proses. Ini tidak akan membantu dalam situasi itu, keluar dari sesi jauh akan menghentikan perintah bahkan jika itu ada di latar belakang.
terdon
@terdon sudahkah Anda memeriksa apakah contoh saya berfungsi? Saya telah memeriksa dan berfungsi untuk beberapa perintah, seperti yang telah saya tulis dalam jawaban saya.
terbang styrofoam
Ya, saya telah memeriksa dan ya, saya telah melihat bahwa kadang-kadang perintah berlanjut. Namun, saya sudah sangat sering melihat bahwa perintah berhenti jadi kecuali Anda dapat menjelaskan dengan tepat apa yang melanjutkan perintah atau memberikan cara untuk mengetahui terlebih dahulu apakah akan melanjutkan atau tidak, ini tidak terlalu berguna. Faktanya, contoh spesifik yang Anda berikan gagal pada tes yang baru saja saya jalankan menghubungkan dari Arch saya ke sistem Ubuntu jauh.
terdon
@terdon lucu, saya telah memeriksa ini pada ArchLinux lokal yang terhubung ke PLD jarak jauh. Satu-satunya aturan yang berfungsi sepanjang waktu adalah "apakah program menggunakan isatty()dan keluar jika tidak?"
terbang styrofoam
Itu mungkin pantas pertanyaannya sendiri. Saya tahu saya dulu selalu membutuhkan nohup, dan kemudian pada titik tertentu sesuatu berubah dan kadang-kadang tidak. Saya tidak bisa melihat bagaimana isatty itu, jika Anda keluar dari shell induk, itu juga harus membunuh anak itu. Tapi ya, kadang tidak. Saya kira itu pasti bisa dikonfigurasi.
nohup
.Jawaban:
Anda memiliki dua pilihan utama:
Jalankan perintah dengan
nohup
. Ini akan memisahkannya dari sesi Anda dan membiarkannya terus berjalan setelah Anda memutuskan koneksi:Perhatikan bahwa stdout dari perintah akan ditambahkan ke file yang dipanggil
nohup.out
kecuali Anda mengarahkan ulang (nohup pythonScript.py > outfile
).Gunakan seperti multiplexer layar
tmux
. Ini akan memungkinkan Anda memutuskan sambungan dari mesin jarak jauh tetapi kemudian, lain kali Anda terhubung, jika Anda menjalankantmux attach
lagi, Anda akan menemukan diri Anda dalam sesi yang persis sama. Perintah masih akan berjalan (itu akan terus berjalan ketika Anda logout) dan Anda akan dapat melihat stdout dan stderr seolah-olah Anda tidak akan pernah logout:Setelah Anda meluncurkannya, tutup saja jendela Putty. Kemudian, hubungkan lagi keesokan harinya, jalankan
tmux attach
lagi dan Anda kembali ke tempat Anda mulai.sumber
disown
2.screen
byobu
, pembungkus tmux atau layar.The
screen
alat, tersedia untuk semua distro Linux, mendukung ini.Untuk menginstalnya, jalankan
apt-get install screen
distro Linux berbasis deb, ataudnf install -y screen
atau yangyum install -y screen
berbasis RPM.Menggunakan:
$ screen
Shell baru dimulai. Dalam shell ini, Anda dapat memulai skrip Python Anda. Kemudian Anda dapat menekan Ctrl+ Shift+ Alalu D. Ini akan melepaskan terminal Anda dari shell yang menjalankan skrip Anda. Selanjutnya, skrip masih berjalan di dalamnya.
Untuk melihat bagaimana skrip Anda berjalan, Anda dapat menelepon
screen -r
. Ini akan memasang kembali terminal Anda ke shell dengan skrip Python yang Anda jalankan di latar belakang.UPD: seperti yang disebutkan Fox, layar berfungsi buruk dengan systemd, tetapi kita dapat menggunakan systemd untuk memulai skrip, seperti yang mereka katakan dalam contoh resmi .
Misalnya, jika skrip Anda dimulai oleh
/usr/bin/myPythonScript
, Anda dapat membuat file unit Systemd, seperti ini.$ cat /etc/systemd/system/myPythonScript.service
Daripada, Anda dapat memulai skrip ini
# systemctl daemon-reload
# systemctl start myPythonScript
Jika Anda ingin membuat skrip ini dimulai secara otomatis pada awal sistem -
# systemctl enable myPythonScript
Kapan saja Anda dapat melihat bagaimana skrip Anda berjalan
# systemctl status myPythonScript
Iklan Anda dapat meninjau log skrip Anda
# journalctl -u myPythonScript -e
sumber
screen
tidak persis bermain dengan baiksystemd
dalam konfigurasi default. Saya tidak tahu apakah Ubuntu menggunakansystemd
, tetapi perilaku dan solusinya mungkin layak disebutkan dalam jawaban AndaSebagian besar proses dapat tertipu dengan mengarahkan stdout, stderr, stdin (tidak semua deskriptor selalu diperlukan untuk mengarahkan ulang) dan menggunakan
&
operator kontrol.Lihat yang
ping example.com 1>/dev/null &
melakukan pekerjaan.Tentu saja, beberapa program lebih canggih dan membutuhkan solusi seperti yang disebutkan @terdon, tetapi ada baiknya untuk mengetahui dan menggunakan yang terbaik.
EDIT: seperti yang tertulis dalam jawaban ini membunuh
systemd
proses saat logout. Beberapa versisystemd
proses kill pada logout secara default, yang lain tidak. Perilaku ini dapat diubah dengan memodifikasi /etc/systemd/logind.conf dengan mengatur opsi berikut. Seperti yang tertulis, ini juga dapat memecahkan beberapa masalah yang Anda miliki dengan solusi @ terdon.dari
man logind.conf
:Baca jawaban yang terhubung untuk mencari tahu lebih lanjut.
sumber
isatty()
dan keluar jika tidak?"