Katakanlah saya meluncurkan banyak proses dari sesi ssh. Apakah mungkin untuk mengakhiri sesi ssh sambil menjaga proses-proses tersebut berjalan pada mesin jarak jauh?
Katakanlah saya meluncurkan banyak proses dari sesi ssh. Apakah mungkin untuk mengakhiri sesi ssh sambil menjaga proses-proses tersebut berjalan pada mesin jarak jauh?
Jawaban:
Anda harus mencari alternatif modern seperti tmux
.
tmux
lebih unggul daripada screen
banyak alasan, berikut adalah beberapa contoh:
Untuk mendapatkan fungsionalitas yang sama seperti yang dijelaskan dalam jawaban yang merekomendasikan screen
, Anda perlu melakukan hal berikut:
tmux
dengan mengetikkan tmux
ke dalam shelltmux
sesi yang dimulaitmux
sesi 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 attach
untuk melampirkan ke tmux
sesi 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
.
tmux
dapat melakukan banyak hal lebih maju daripada menangani satu jendela dalam satu sesi. Untuk informasi lebih lanjut lihat di man tmux
atau yang tmux halaman GitHub . Secara khusus, inilah FAQ tentang perbedaan utama antara screen
dan tmux
.
screen -x -r [screenname]
atau screen -rx
singkatnya jika Anda hanya memiliki satu sesi layar aktif. Ini memungkinkan Anda untuk melampirkan instance layar yang ada.
Ctrl-b
dan kemudian d
untuk meninggalkan / melepaskan tmux
sesi. Tentu saja itu adalah kasus untuk versi tmux
di Ubuntu 12.04 saya.
tmux detach
alih-alih mengetikctrl-b d
nohup
Cara terbaik seringkali yang paling sederhana.
nohup long-running-command &
Itu dibuat khusus untuk ini, bahkan log stdout ke nohup.log
.
man nohup
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 disown
harus menjaga proses berjalan setelah Anda keluar.
screen
dan yang lain bisa melakukannya, tapi bukan itu gunanya. Saya merekomendasikan nohup
untuk tugas-tugas yang Anda tahu akan Anda tinggalkan dan bg
untuk 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.
disown -h
bg
+ disown
tidak 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+z
menghentikan proses, mengembalikan saya ke bash. bg
melanjutkan proses, tetapi juga melanjutkan keluaran status ke bash, sehingga tidak mungkin untuk melihat apa yang saya ketik. Namun, sebuah disown
perintah menghasilkan "disown: current: no job
julia myFile.jl
alasan apa pun. tmux benar-benar hebat.
Anda bisa melakukannya dengan menggunakan screen
.
Ketik man screen
untuk mencari tahu lebih lanjut atau baca halaman manual layar ini .
Skenario sederhana:
ssh ke kotak remote Anda. Ketik screen
Kemudian 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 -r
Ini akan "melanjutkan" sesi layar Anda, dan Anda dapat melihat output dari proses Anda.
screen -S name
untuk membuatnya lebih mudah untuk terhubung ke yang benar nanti.
screen -S
sebelum pergi dan screen -r
ketika kembali luar biasa!
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
-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 baik-a
maupun-r
opsi diberikan, pekerjaan saat ini digunakan. Jika tidak ada jobspec yang disediakan,-a
opsi berarti menghapus atau menandai semua pekerjaan; yang-r
pilihan tanpa JOBSPEC argumen membatasi operasi untuk menjalankan pekerjaan.
Dengan disown Anda dapat menutup terminal dan menjalankan proses pada mesin.
disown -a && exit
disown
dan membunuhnya.
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:
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 jobs
sebelumnya.
** 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.
disown
perintah bawaan bekerja pada pekerjaan latar terbaru.
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 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.
Anda dapat memulai byobu dengan menjalankan byobu
mesin host setelah terhubung menggunakan ssh. Ini akan memberi Anda shell yang terlihat seperti ini:
Anda juga dapat menggunakan Terminal Byobu pada mesin Ubuntu dengan opsi -X dan dengan mudah memiliki byobu yang berfungsi dengan baik.
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:
Lain kali Anda datang, lakukan saja byobu
dan Anda sholud akan kembali tepat di tempat Anda berada.
Anda juga dapat membuat berbagai sesi byobu pada byobu -S session1
dan 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 .
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.
disown
untuk mencapai ini. Lihat jawaban @ bassgey
disown
dan jika dibutuhkan saja Ctrl-z
, maka bg
untuk mendapatkannya dari terminal aktif dan ke latar belakang. Lalu disown
,.
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.
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! :)
bg
(tanpa %1
) sering kali cukup, karena default adalah pekerjaan saat ini
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.
&
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)
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 :
screen
untuk mulai pertama, gulir melalui pesan pengantar, Anda harus menyerahkan terminal.screen -r
untuk 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.
Jawaban paling sederhana ...
ctrl + z akan menunda program yang sedang berjalan
"bg" akan menjalankannya di latar belakang
disown
atau nohup
), ini biasanya tidak akan membuat proses berjalan setelah akhir sesi SSH.
Sementara semua orang mengatakan untuk menggunakan disown
(satu-satunya pilihan yang Anda miliki setelah Anda memulai proses),, nohup
atau 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 screen
akan 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 nohup
kecuali 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?
Sayangnya, sesi SSH yang dihentikan dapat mengakibatkan tmux atau layar mati. Ini karena systemd
akan 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 .
Dari pada :
cmd options;
Tambahkan sebelumnya nohup
:
nohup cmd options &
Kemudian, Anda dapat melihat konsol stdout dengan:
tail -f nohup.out