Bagaimana cara menjaga proses tetap berjalan setelah mengakhiri sesi ssh?

Katakanlah saya meluncurkan banyak proses dari sesi ssh. Apakah mungkin untuk mengakhiri sesi ssh sambil menjaga proses tersebut berjalan di mesin Jarak Jauh?

Anda harus mencari alternatif modern seperti tmux.

tmux lebih unggul dari screen untuk banyak alasan, berikut adalah beberapa contoh:

  • Jendela dapat dipindahkan antara sesi dan bahkan terkait dengan beberapa sesi
  • Jendela dapat dibagi secara horizontal dan vertikal menjadi panel
  • Dukungan untuk terminal warna UTF - 8 dan 256
  • Sesi dapat dikontrol dari shell tanpa perlu memasukkan sesi

Fungsi Dasar

Untuk mendapatkan fungsi yang sama seperti yang dijelaskan dalam jawaban merekomendasikan screen, Anda perlu melakukan hal berikut:

  • ssh ke dalam mesin remote
  • mulai tmux dengan mengetik tmux ke dalam cangkang
  • mulai proses yang Anda inginkan di dalam started tmux sesi
  • tinggalkan / lepaskan tmux sesi dengan mengetik Ctrl+b dan kemudian d

Anda sekarang dapat dengan aman log off dari mesin remote, proses Anda akan terus berjalan di dalam tmux. Ketika Anda kembali lagi dan ingin memeriksa status proses Anda, Anda dapat menggunakan tmux attach untuk melampirkan Anda tmux sesi.

Jika Anda ingin beberapa sesi berjalan berdampingan, Anda harus memberi nama setiap sesi menggunakan Ctrl+b dan $. Anda bisa mendapatkan daftar sesi yang sedang berjalan menggunakan tmux list-sessions, sekarang lampirkan ke sesi yang sedang berjalan dengan perintah tmux attach-session -t <session-name>.

tmux dapat melakukan hal-hal yang jauh lebih maju daripada menangani satu jendela dalam satu sesi. Untuk informasi lebih lanjut lihat di man tmux atau tmux GitHub page. Secara khusus, berikut adalah FAQ tentang perbedaan utama antara screen dan tmux.

Opsi 1: nohup

Cara terbaik seringkali yang paling sederhana.

nohup long-running-command &

Itu dibuat khusus untuk ini, bahkan log stdout untuk nohup.log.

man nohup

Opsi 2: bg + disown

ctrl+zbgdisown -h

Jika Anda ingin & quot;latar belakang & quot; sudah menjalankan tugas, maka Ctrl+Z kemudian jalankan bg untuk menempatkan tugas ditangguhkan terbaru Anda ke latar belakang, memungkinkannya untuk terus berjalan. disown akan menjaga proses berjalan setelah Anda log out. The -h bendera mencegah hangup.


screen dan orang lain bisa melakukannya, tapi bukan itu tujuannya. Saya sarankan nohup untuk tugas-tugas Anda tahu Anda akan meninggalkan dan bg untuk tugas yang sudah anda jalankan dan tidak ingin memulai kembali.

Perlu diingat, keduanya spesifik bash. Jika Anda tidak menggunakan bash, maka perintahnya bisa berbeda.

Anda bisa melakukannya dengan menggunakan screen.

Jenis man screen untuk mengetahui lebih lanjut atau membaca ini halaman manual layar.

Skenario sederhana:

  • ssh ke dalam kotak jarak jauh Anda. Jenis screen Kemudian mulailah proses yang Anda inginkan.

  • Pers Ctrl-A kemudian Ctrl-D. Ini akan "melepaskan" sesi layar Anda tetapi membiarkan proses Anda berjalan. Anda sekarang dapat keluar dari kotak Jarak Jauh.

  • Jika Anda ingin kembali lagi nanti, masuk lagi dan ketik screen -r Ini akan "melanjutkan" sesi layar Anda, dan Anda dapat melihat output dari proses Anda.

Layar dan nohup adalah cara yang lebih baik, tetapi jika Anda harus melepaskan proses yang sudah berjalan tanpa layar atau nohup, Anda dapat menjalankan perintah disown.

disown [-ar] [-h] [jobspec… |pid… ]

Tanpa opsi, Hapus masing-masing jobspec dari tabel pekerjaan aktif. Jika -h opsi diberikan, pekerjaan tidak dihapus dari tabel, tetapi ditandai sehingga SIGHUP tidak dikirim ke pekerjaan jika shell menerima SIGHUP. Jika jobspec tidak hadir, dan tidak -a maupun -r opsi disediakan, pekerjaan saat ini digunakan. Jika tidak ada jobspec disediakan, yang -a Opsi berarti menghapus atau menandai semua pekerjaan; -r opsi tanpa jobspec argumen membatasi operasi untuk menjalankan pekerjaan.

Dengan disown Anda dapat menutup terminal dan menjalankan proses pada mesin.

Saya terjebak dalam mv besar jadi saya tidak dalam posisi untuk menghentikan proses, mengatur layar dan kemudian memulainya lagi. Saya berhasil keluar dari sesi SSH dengan proses yang berjalan pada dasarnya dengan melakukan langkah-langkah berikut:

  1. Buat koneksi SSH: ssh user@host
  2. Jalankan perintah yang diinginkan untuk memulai proses
  3. Pers Ctrl+Z untuk menghentikan proses
  4. Lari bg untuk menempatkan proses yang dijeda di latar belakang dan melanjutkannya.
  5. Lari disown [pid] (ID proses adalah opsional, default ke proses terakhir) untuk menolak proses. Untuk mendapatkan daftar pekerjaan cukup ketik jobs sebelumnya.
  6. Keluar dari sesi SSH dengan menjalankan logout.

Penggunaan disown perintah:

disown [-ar] [-h] [jobspec ... | pid ... ]              Without  options,  remove  each jobspec from the table of active              jobs.  If jobspec is not present, and neither the -a nor the  -r              option  is  supplied, the current job is used.  If the -h option              is given, each jobspec is not removed from  the  table,  but  is              marked  so  that  SIGHUP  is  not  sent  to the job if the shell              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option              means  to  remove or mark all jobs; the -r option without a job‐              spec argument restricts operation to running jobs.   The  return              value is 0 unless a jobspec does not specify a valid job.

Ada dua program utama yang dapat Anda gunakan untuk mempertahankan program dan status terminal melalui beberapa koneksi ssh. Mereka adalah layar (incumbent, tapi sayangnya tidak terawat. Rupanya sedang aktif dikembangkan sekarang) dan tmux (lebih baru, dipelihara secara aktif). Byobu adalah ujung depan yang dapat berjalan di atas sistem mereka dan menawarkan informasi status ubuntu tambahan. Pada instalasi baru itu akan menggunakan tmux sebagai backend, jika Anda memiliki instalasi byobu yang lebih lama dan konfigurasi yang ada, itu akan mempertahankan backend sebelumnya, baik itu layar atau tmux.

Byobu

Byobu dapat diinstal di komputer dengan melakukannya di Mesin berbasis Debian:

sudo aptitude install byobu

Menggunakan yum, Anda lakukan

su -c 'yum install byobu'

Ini juga memungkinkan untuk menginstal byobu pada distribusi lain.

Menggunakan byobu

Anda dapat memulai byobu dengan menjalankan byobu pada mesin host setelah menghubungkan menggunakan ssh.Ini akan memberi Anda cangkang yang terlihat seperti ini:

image-byobu

Anda juga dapat menggunakan terminal Byobu pada mesin Ubuntu dengan opsi-X dan dengan mudah memiliki byobu yang berfungsi sempurna.

Penggunaan:

Mulai byobu dengan mengetik byobu.

Anda dapat menekan F2 untuk membuat jendela baru dalam sesi saat ini, F3-F4 untuk beralih di antara berbagai jendela.

Bagian terbaik tentang byobu adalah, Anda tidak perlu benar-benar mematikan proses yang berjalan di terminal untuk meninggalkan terminal. Anda hanya dapat mengirim layar / tmux (kerangka byobu) ke latar belakang dan melanjutkan waktu berikutnya Anda datang:

  • Untuk meninggalkan byobu dan keeep itu berjalan (melepaskan) tekan F6.

  • Lain kali Anda datang, lakukan saja byobu dan Anda sholud akan kembali tepat di mana Anda berada.

    byobu-detach-attach

Anda juga dapat membuat berbagai sesi byobu dengan byobu -S session1 dan sebagainya. Dan Anda dapat terhubung ke salah satu dari mereka ketika Anda kembali.

Anda dapat melakukan lebih banyak menggunakan Byobu. Gunakan!Beberapa panduan definitif adalah di sini, atau di sini.

Anda tidak dapat melakukan ini setelah proses dimulai, anda harus mengatur semuanya sebelum Anda menjalankan pekerjaan yang berjalan lama.

Anda dapat menggunakan nohup tetapi kebijaksanaan modern menyarankan Anda menggunakan layar atau byobu sebagai login Anda sehingga anda dapat melepaskan dan membiarkan semuanya berjalan.

Layar memiliki keuntungan yang dapat Anda lepaskan dari satu mesin dan pasang kembali dari yang lain yang berguna jika Anda ingin memeriksa proses yang berjalan lama yang berjalan di luar akhir hari kerja.

Ada masuk akal memulai panduan untuk layar ini.

byobu menempatkan antarmuka yang mudah digunakan di atas layar dengan menu dll. Ini juga merupakan implementasi layar saat ini di ubuntu yang lebih baru. F2 untuk memulai Terminal Baru F3 / F4 untuk beralih bolak-balik dan F6 untuk memutuskan sambungan. Ketik exit untuk benar-benar mengakhiri terminal secara permanen.

Untuk skrip shell tunggal yang telah saya jalankan dalam jangka waktu yang lama, saya akan masuk, dan menjalankan proses di latar belakang menggunakan '&'.

Contoh:

/path/to/my/script &

Saya telah keluar dan memutus sesi SSH saya. Ketika saya masuk beberapa waktu kemudian, skrip masih dijalankan sebagaimana dibuktikan oleh pengumpulan data berkelanjutan dari skrip.

Hei, sementara saya setuju bahwa layar adalah pilihan yang paling efektif.Anda dapat menggunakan vncserver dan kemudian memulai proses di atasnya.

Juga jika satu-satunya minat Anda adalah menjalankan proses dan tidak perlu mengendalikannya kembali, dan yang paling penting Anda tidak sadar bahwa Anda harus menutup sesi dan Anda memiliki proses yang sudah berjalan, Anda tidak beruntung jika Anda menggunakan bash sebagai shell

Pertama, Anda perlu mengirim proses ke latar belakang dengan mengetik Ctrl + Z diikuti oleh bg %1 (jumlahnya tergantung pada nomor pekerjaan, biasanya 1, tetapi Anda dapat dengan mudah menarik daftar menggunakan perintah pekerjaan)

Akhirnya memanggil perintah menyangkal (diikuti oleh jobid ... sama seperti dengan perintah bg)

Ini akan menghapus hubungan induk-anak antara shell Anda dan proses di latar belakang, mencegahnya mati saat shell anda dihentikan.

Anda harus memeriksa Layar GNU dan lihat apakah itu membantu Anda. Tergantung pada bagaimana Anda membutuhkan aplikasi Anda untuk berjalan secara realtime, dapat menyebabkan lebih banyak masalah daripada memecahkan, tapi setidaknya itu akan memungkinkan Anda untuk melanjutkan sesi Anda seolah-olah Anda tidak pernah meninggalkannya.

Cara menggunakan :

  • Gunakan perintah screen untuk awal pertama, gulir melalui pesan pengantar, Anda harus menyerahkan terminal.
  • C-A C-C membuka terminal lain
  • C-A C-k membunuh terminal
  • Anda dapat menggunakan C-A C-Space dan C-A C-Backspace untuk siklus melalui terminal
  • C-A C-A berguna jika Anda kebanyakan hanya menggunakan dua terminal
  • C-A C-d detachs sesi layar saat ini dan keluar layar. Anda kemudian dapat menggunakan screen -r untuk melanjutkan sesi tersebut. Anda dapat memiliki beberapa sesi layar terpisah sekaligus, dalam hal ini Anda akan ditampilkan daftar sesi yang tersedia.

Ada banyak opsi lain, misalnya layar terpisah, dan juga semua pintasan sepenuhnya dapat disesuaikan.

Terkait: How can I run a command which will survive terminal close? - Unix & Linux Stack Exchange