Bagaimana agar proses tetap berjalan setelah mengakhiri sesi ssh?

644

Katakanlah saya meluncurkan banyak proses dari sesi ssh. Apakah mungkin untuk mengakhiri sesi ssh sambil menjaga proses-proses tersebut berjalan pada mesin jarak jauh?

Olivier Lalonde
sumber
2
Terkait: unix.stackexchange.com/questions/4004/…
Anton Tarasenko

Jawaban:

750

Anda harus mencari alternatif modern seperti tmux.

tmuxlebih unggul daripada screenbanyak alasan, berikut adalah beberapa contoh:

  • Windows dapat dipindahkan antar sesi dan bahkan ditautkan ke beberapa sesi
  • Windows dapat dipisah secara horizontal dan vertikal menjadi panel
  • Dukungan untuk terminal warna UTF-8 dan 256
  • Sesi dapat dikontrol dari shell tanpa perlu memasuki sesi

Fungsi Dasar

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

  • ssh ke mesin jarak jauh
  • mulai tmuxdengan mengetikkan tmuxke dalam shell
  • memulai proses yang Anda inginkan di dalam tmuxsesi yang dimulai
  • tinggalkan / lepaskan tmuxsesi dengan mengetik Ctrl+ blalud

Anda sekarang dapat keluar dengan aman dari mesin jarak jauh, proses Anda akan terus berjalan di dalam tmux. Ketika Anda kembali lagi dan ingin memeriksa status proses Anda, Anda dapat menggunakan tmux attachuntuk melampirkan ke tmuxsesi Anda .

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

tmuxdapat melakukan banyak hal lebih maju daripada menangani satu jendela dalam satu sesi. Untuk informasi lebih lanjut lihat di man tmuxatau yang tmux halaman GitHub . Secara khusus, inilah FAQ tentang perbedaan utama antara screendan tmux.

tongpu
sumber
4
@CraigM Gunakan screen -x -r [screenname]atau screen -rxsingkatnya jika Anda hanya memiliki satu sesi layar aktif. Ini memungkinkan Anda untuk melampirkan instance layar yang ada.
Lekensteyn
5
Saran ini membantu saya dengan masalah yang sama tetapi saya pikir itu termasuk salah ketik. Saya cukup yakin bahwa Anda perlu mengetik Ctrl-bdan kemudian duntuk meninggalkan / melepaskan tmuxsesi. Tentu saja itu adalah kasus untuk versi tmuxdi Ubuntu 12.04 saya.
cxrodgers
17
Saya membuat kesalahan saat mengikuti instruksi di atas. Saya akan membagikannya jika ada orang yang jatuh ke dalam kesalahan yang sama: Saya mulai tuxux di shell komputer saya sendiri dan bukannya shell komputer remote. Orang perlu memulai tmux di shell komputer remote.
Mert Nuhoglu
5
Layar sekarang sedang dikembangkan lagi: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Bisakah Anda memperbarui jawaban Anda?
muru
4
Atau, jalankan tmux detachalih-alih mengetikctrl-b d
Andrew
305

Pilihan 1: nohup

Cara terbaik seringkali yang paling sederhana.

nohup long-running-command &

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

man nohup

Pilihan 2: bg

Jika Anda ingin "latar belakang" beberapa tugas yang sudah berjalan, maka taruhan terbaik Anda adalah Ctrl+ Zkemudian jalankan

bg

untuk menempatkan tugas Anda yang terakhir ditangguhkan ke latar belakang, memungkinkannya untuk terus berjalan.

Maka quick disownharus menjaga proses berjalan setelah Anda keluar.

screendan yang lain bisa melakukannya, tapi bukan itu gunanya. Saya merekomendasikan nohupuntuk tugas-tugas yang Anda tahu akan Anda tinggalkan dan bguntuk tugas-tugas yang sudah Anda jalankan dan tidak ingin memulai kembali.

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

kapas
sumber
4
Saya akan merekomendasikan untuk melakukandisown -h
Michele
Menariknya, layar dan tmux tidak berfungsi untuk penambang, tetapi juga pekerjaan
Yasin Okumuş
1
bg+ disowntidak bekerja untuk saya. Saya menjalankan skrip penerapan yang saya lupa untuk memulai di dalam tmux, dan perlu pergi lebih awal untuk rapat. Skrip terus menampilkan kemajuan ke shell. ctrl+zmenghentikan proses, mengembalikan saya ke bash. bgmelanjutkan proses, tetapi juga melanjutkan keluaran status ke bash, sehingga tidak mungkin untuk melihat apa yang saya ketik. Namun, sebuah disownperintah menghasilkan "disown: current: no job
like
ini tidak bekerja untuk saya dengan julia myFile.jlalasan apa pun. tmux benar-benar hebat.
kilgoretrout
Ini bekerja untuk saya, terima kasih banyak
Chad
207

Anda bisa melakukannya dengan menggunakan screen.

Ketik man screenuntuk mencari tahu lebih lanjut atau baca halaman manual layar ini .

Skenario sederhana:

  • ssh ke kotak remote Anda. Ketik screenKemudian mulailah proses yang Anda inginkan.

  • Tekan Ctrl- Alalu Ctrl- D. Ini akan "melepaskan" sesi layar Anda tetapi membiarkan proses Anda berjalan. Anda sekarang dapat keluar dari kotak remote.

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

Lincoln
sumber
32
Saya biasanya akan memberi nama sesi layar saya menggunakan screen -S nameuntuk membuatnya lebih mudah untuk terhubung ke yang benar nanti.
David Oneill
Tautannya
1
Secara pribadi, saya mengerjakan kotak tanpa perangkat lunak kontrol paket. Setelah menghabiskan sekitar setengah jam membangun dependensi untuk TMUX (yang secara pribadi saya punya pengalaman dan sukai) dari sumber, menjadi jelas bahwa layar adalah solusi yang lebih baik dan lebih sederhana bagi saya. TL; DR: solusi optimal untuk masalah ini tergantung pada use case, mesin, dan berapa banyak waktu yang harus Anda siapkan. Terima kasih atas jawaban ini :)
Max von Hippel
Kombinasi dengan screen -Ssebelum pergi dan screen -rketika kembali luar biasa!
Meloman
Terima kasih untuk ini. Solusi ini bekerja untuk saya sementara tmux tidak (saya menggunakan versi bash untuk windows saat ssh'ing ke mesin linux)
Michael Sorensen
83

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 setiap jobspec dari tabel pekerjaan aktif. Jika -hopsi diberikan, pekerjaan tidak dihapus dari tabel, tetapi ditandai sehingga SIGHUP tidak dikirim ke pekerjaan jika shell menerima SIGHUP. Jika JOBSPEC tidak hadir, dan baik -amaupun -ropsi diberikan, pekerjaan saat ini digunakan. Jika tidak ada jobspec yang disediakan, -aopsi berarti menghapus atau menandai semua pekerjaan; yang -rpilihan tanpa JOBSPEC argumen membatasi operasi untuk menjalankan pekerjaan.

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

bassgey
sumber
10
Ini juga cara favorit saya untuk melakukannya. Saya sering menggunakandisown -a && exit
Stefano Palazzo
1
Sempurna. Ini adalah perintah yang indah dan layak mendapatkan semua upvote!
Greg
8
Satu kata peringatan, saya menghentikan proses yang berjalan dengan Ctrl-Z dan tidak memulainya di latar belakang sebelum memanggil disowndan membunuhnya.
HDave
3
Dapat macet jika ingin menulis ke terminal. Mengarahkan output dari proses yang berjalan tidak mudah. Lebih baik memulainya dengan benar dengan nohup.
jiggunjer
2
Ini jawaban yang bagus, karena langsung menjawab pertanyaan. Penulis pertanyaan bertanya apa yang harus dilakukan setelah menjalankan banyak perintah yang sudah berjalan lama. Sebagian besar jawaban ini memberi tahu Anda apa yang harus dilakukan sebelum Anda menjalankan perintah.
q0rban
53

Saya terjebak dalam mv besar jadi saya tidak dalam posisi untuk menghentikan proses, pengaturan layar dan kemudian mulai lagi. Saya berhasil keluar dari sesi ssh dengan proses berjalan dengan dasarnya melakukan langkah-langkah berikut:

  1. ssh [server]
  2. perintah
  3. Ctrl+Z
  4. bg
  5. disown [proses pid opsional, default ke bertahan]
  6. keluar

Langkah 3 menjeda proses saat ini (mis. Perintah 'mv' saya).
Langkah 4 menempatkan proses yang dijeda ke latar belakang dan melanjutkannya.
Langkah 5 memungkinkan Anda menolak proses. ** Untuk mendapatkan daftar pekerjaan cukup ketik jobssebelumnya.


** Mengenai penolakan (dari manual bash):

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.
Kekacauan
sumber
2
Built-in selalu menjadi pilihan pertama saya :) THX
ken_oy
Jawaban ini harus ditandai sebagai benar. Untuk menginstal dan membiasakan diri menyaring untuk memecahkan masalah ini berlebihan.
Ulrich-Lorenz Schlüter
Ini sangat membantu ketika Anda sudah memulai perintah apa pun dan yang sedang berjalan lama. Mengakhiri dan memulainya dalam Sesi TMUX akan memakan waktu
Deepali Mittal
1
@ tom-brossman: Harap perhatikan pengeditan yang tidak perlu seperti ini ! Jika dipanggil tanpa spesifikasi pekerjaan, disownperintah bawaan bekerja pada pekerjaan latar terbaru.
David Foerster
22

Ada dua program utama yang dapat Anda gunakan untuk mempertahankan program dan status terminal melalui beberapa koneksi ssh. Mereka layar (petahana, 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 ini akan menggunakan tmux sebagai backend, jika Anda memiliki instalasi byobu yang lebih lama dan konfigurasi yang ada 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'

Dimungkinkan juga untuk menginstal byobu pada distribusi lain.

Menggunakan byobu

Anda dapat memulai byobu dengan menjalankan byobumesin host setelah terhubung menggunakan ssh. Ini akan memberi Anda shell 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 dengan baik.

Pemakaian:

Mulai byobu dengan mengetik byobu.

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

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

  • Untuk meninggalkan byobu dan membiarkannya tetap berjalan (lepas) tekan F6.
  • Lain kali Anda datang, lakukan saja byobudan Anda sholud akan kembali tepat di tempat Anda berada.

    byobu-detach-attach

Anda juga dapat membuat berbagai sesi byobu pada byobu -S session1dan seterusnya. Dan Anda dapat terhubung ke salah satu dari mereka ketika Anda kembali.

Anda dapat melakukan lebih banyak lagi dengan menggunakan Byobu. Gunakan! Beberapa panduan pasti ada di sini , atau di sini .

SiddharthaRT
sumber
Saya mencoba menggunakan byobu dari sesi berbasis Putty ke kotak Ubuntu saya, tetapi saya mendapatkan baris status diulang dan bergulir di layar. Meskipun terlepas dengan benar ketika menekan F6, itu bukan solusi yang bisa digunakan dalam pengaturan saya.
jfmessier
1
@ jfmessier Itu karena Putty tidak menerima ncurses (utf-8 pada dasarnya) dengan baik. Dimungkinkan untuk menghilangkan masalah ini dengan mengikuti utas ini - stackoverflow.com/questions/10731099/...
SiddharthaRT
Ini luar biasa! 1. itu memberi saya bash prompt berwarna yang sepertinya saya tidak bisa aktifkan dengan bash sebagai shell default saya dan 2. saya bisa menjalankan 2 bot pada saat yang sama dan masih memiliki terminal lain untuk dikerjakan! @ SiddharthaRT Anda layak mendapat upvote Pak
Dev
18

Anda tidak dapat melakukan ini setelah proses dimulai, Anda harus mengatur semuanya sebelum 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 hal-hal 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 panduan memulai yang wajar untuk menyaring di sini.

byobu menempatkan antarmuka yang mudah digunakan di atas layar dengan menu dll. Ini juga merupakan implementasi layar saat ini pada 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.

Richard Holloway
sumber
byobu menggunakan tmux hari ini ..
scottl
12
"Kamu tidak bisa melakukan ini setelah prosesnya dimulai, kamu harus mengatur semuanya sebelum menjalankan pekerjaan yang berjalan lama." - tidak, Anda dapat menggunakan disownuntuk mencapai ini. Lihat jawaban @ bassgey
Kaya
1
setelah berjuang untuk belajar layar dan tmux .... byobu membawa air mata ke mataku
HDave
disowndan jika dibutuhkan saja Ctrl-z, maka bguntuk mendapatkannya dari terminal aktif dan ke latar belakang. Lalu disown,.
mimoralea
8

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

Juga jika interes Anda satu-satunya adalah agar proses berjalan dan tidak perlu mengambil kendali kembali, dan yang paling penting Anda tidak tahu Anda harus menutup sesi dan Anda memiliki proses sudah berjalan, Anda tidak beruntung jika Anda menggunakan bash sebagai shell

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

Akhirnya jalankan perintah yang ditolak (diikuti oleh jobid ... sama seperti dengan perintah bg)

Ini akan menghapus hubungan orangtua-anak antara shell Anda dan proses di latar belakang, mencegahnya mati ketika shell Anda dihentikan.

Jorge Gutierrez
sumber
2
Jawaban ini adalah yang terbaik! Mengapa semua orang berbicara screen, pertanyaannya adalah acara pasca-masuk, bagaimana menjaga proses berjalan, sekarang setelah masuk tetapi sebelum memulai mereka. Jawaban yang bagus Jorge, Anda benar-benar membantu saya! :)
jwbensley
1
Cukup bg(tanpa %1) sering kali cukup, karena default adalah pekerjaan saat ini
Walter Tross
Akan menyenangkan untuk memiliki jawaban yang komprehensif: A priori (pengaturan di muka): layar terminal ascii (lama), tmux (lebih baru); X windows: vnc (lama, masih dipertahankan), xpra (lebih baru), dengan xpra tidak dapat di-root. Seorang posterior (bertahan setelah Anda mulai): ^ Z, ditolak, ... Tapi saya terlalu malas untuk menyempurnakannya lebih dari ini.
Krazy Glew
8

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 dieksekusi sebagaimana dibuktikan dengan pengumpulan data terus menerus dari skrip.


sumber
3
Ya, saya ingin tahu bagaimana layar / tmux lebih baik daripada solusi sederhana ini.
Mads Skjern
Ya, saya dapat melihat ini di ubuntu saya juga, tetapi seharusnya tidak terjadi secara teori. Saya tidak mengerti mengapa
Daniel Pinyol
1
@MadsSkjern Karena Anda tidak dapat memasukkan input apa pun ke dalam skrip menggunakan metode ini.
Ken Sharp
1
@MadsSkjern alasannya adalah bahwa jika Anda menjalankan proses seperti ini dengan &jika Anda keluar dan masuk ke sesi SSH Anda, proses akan tetap berjalan namun Anda tidak akan dapat melihat output dari proses itu (jika skrip Anda menggemakan sesuatu yang Anda tidak akan melihatnya, tetapi jika menulis file file akan ada di sana)
DarkCygnus
4

Anda harus memeriksa Layar GNU dan melihat apakah itu membantu Anda. Bergantung pada bagaimana Anda membutuhkan aplikasi Anda untuk berjalan secara realtime, itu mungkin menyebabkan lebih banyak masalah daripada menyelesaikannya, tetapi setidaknya itu akan memungkinkan Anda untuk melanjutkan sesi Anda seolah-olah Anda tidak pernah meninggalkannya.

Cara Penggunaan :

  • Gunakan perintah screenuntuk mulai pertama, gulir melalui pesan pengantar, Anda harus menyerahkan terminal.
  • Ca Cc membuka terminal lain
  • Ca Ck membunuh terminal
  • Anda dapat menggunakan Ca C-Space dan Ca C-Backspace untuk menelusuri terminal
  • Ca Ca berguna jika Anda kebanyakan hanya menggunakan dua terminal
  • Ca Cd melepaskan sesi layar saat ini dan keluar dari layar. Anda kemudian dapat menggunakan screen -runtuk melanjutkan sesi itu. Anda dapat memiliki beberapa sesi layar terpisah sekaligus, dalam hal ini Anda akan ditampilkan daftar sesi yang tersedia.

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

T. Verron
sumber
3

Jawaban paling sederhana ...

ctrl + z akan menunda program yang sedang berjalan

"bg" akan menjalankannya di latar belakang

Roop
sumber
5
Tanpa menolak proses (dengan sesuatu seperti disownatau nohup), ini biasanya tidak akan membuat proses berjalan setelah akhir sesi SSH.
Eliah Kagan
3
Di server Ubuntu saya, dengan pengaturan default, itu benar-benar terus berjalan!
Mads Skjern
3

Cara termudah adalah dengan menjalankan perintah Anda di latar belakang &. Kemudian tulis saja:

disown -a
Zibri
sumber
0

Sementara semua orang mengatakan untuk menggunakan disown(satu-satunya pilihan yang Anda miliki setelah Anda memulai proses),, nohupatau bahkan menjalankan perintah screen, yang berguna jika Anda ingin melihat semua output dari perintah ... Saya penggemar screen.. Saya masih telah mencoba distribusi arus utama Linux dan hanya menempatkan pekerjaan di latar belakang dan berhenti tidak menyebabkan semua proses yang berjalan mati. Harus ada pengaturan global atau sesuatu. Saya mencoba ini pada beberapa sistem yang cukup lama (slackware 12) dan skrip pengujian saya terus berjalan sampai saya membunuhnya secara manual:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Meskipun saya setuju itu screenakan menjadi cara terbaik untuk menjalankan ini, bahkan jika skrip saya menulis untuk mencatat file atau apa pun .. Saya tidak pernah perlu menggunakan disown -a atau nohupkecuali itu keluar dari paranoia lengkap. Mungkin seseorang dapat menjelaskan bagaimana bash berperilaku secara default? Mungkin beberapa administrator sistem mengubah default pada shell besar untuk menjaga proses penggunanya dari overloading sistem?

Dan Gullage
sumber
Jika Anda memiliki pertanyaan lebih lanjut, silakan tanyakan sebagai pertanyaan baru
heemayl
0

Sayangnya, sesi SSH yang dihentikan dapat mengakibatkan tmux atau layar mati. Ini karena systemdakan menghentikan proses anak apa pun setelah keluar dari sesi.

Anda dapat mengubah pengaturan ini di logind.conf( /etc/systemd/logind.conf):

KillUserProcesses=no

Terima kasih untuk menjawab di https://unix.stackexchange.com/questions/490267 .

Jonathan
sumber
-1

Dari pada :

cmd options; 

Tambahkan sebelumnya nohup:

nohup cmd options & 

Kemudian, Anda dapat melihat konsol stdout dengan:

tail -f nohup.out
Abdennour TOUMI
sumber