Pertanyaan Menjaga proses linux berjalan setelah saya keluar


Saya terhubung ke mesin Linux melalui SSH, dan saya mencoba menjalankan skrip bash berat yang membuat operasi filesystem. Diperkirakan akan terus berjalan selama berjam-jam, tetapi saya tidak dapat meninggalkan sesi SSH terbuka karena masalah koneksi internet yang saya miliki.

Saya ragu bahwa menjalankan skrip dengan operator latar belakang, ampersand (&), akan melakukan trik, karena saya mencoba dan kemudian menemukan bahwa proses itu tidak selesai. Bagaimana saya bisa keluar dan terus menjalankan prosesnya?


139
2017-09-15 06:00






Jawaban:


Metode terbaik adalah memulai proses dalam multiplekser terminal. Atau Anda dapat membuat proses tidak menerima sinyal HUP.


SEBUAH multiplekser terminal menyediakan terminal "virtual" yang berjalan independen dari terminal "nyata" (sebenarnya semua terminal saat ini adalah "virtual" tetapi itu adalah topik lain untuk hari lain). Terminal virtual akan tetap berjalan bahkan jika terminal asli Anda ditutup dengan sesi ssh Anda.

Semua proses mulai dari terminal virtual akan tetap berjalan dengan terminal virtual itu. Ketika Anda tersambung kembali ke server, Anda dapat terhubung kembali ke terminal virtual dan semuanya akan seolah-olah tidak ada yang terjadi, selain waktu yang berlalu.

Dua multiplekser terminal yang populer adalah layar dan tmux.

Layar memiliki kurva belajar yang curam. Berikut ini tutorial yang bagus dengan diagram yang menjelaskan konsepnya: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


Itu MEMPERCEPATKAN sinyal (atau SIGHUP) dikirim oleh terminal ke semua proses anaknya ketika terminal ditutup. Tindakan umum setelah menerima SIGHUP adalah berakhir. Jadi ketika sesi ssh Anda terputus semua proses Anda akan berakhir. Untuk menghindari ini, Anda dapat membuat proses Anda tidak menerima SIGHUP.

Dua metode mudah untuk melakukannya adalah nohup dan disown.

Untuk informasi lebih lanjut tentang caranya nohup dan disown bekerja membaca pertanyaan dan jawaban ini: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Catatan: meskipun proses akan terus berjalan Anda tidak dapat lagi berinteraksi dengan mereka karena mereka tidak lagi terhubung ke terminal apa pun. Metode ini terutama berguna untuk proses batch yang berjalan lama yang, begitu dimulai, tidak lagi membutuhkan input pengguna.


132
2017-09-15 06:05



Saya suka jawaban ini karena memberikan solusi untuk situasi interaktif dan non-interaktif. Dalam kasus interaktif, screen memberi Anda lebih banyak pilihan, tetapi jika Anda menggunakan authorized_keys untuk memungkinkan orang menjalankan skrip secara jarak jauh melalui ssh, yang nohup pilihan adalah cara sederhana yang bagus untuk skrip untuk memulai proses yang bertahan lebih lama daripada ssh sesi digunakan untuk memulai mereka. - Mark Booth
@rahmanisback - Ingat bahwa Anda dapat mengubah jawaban yang diterima kapan saja. Hanya karena sejauh ini jawaban Erica paling tinggi tidak berarti itu jawaban terbaik untuk Anda, memang menjadikannya jawaban yang diterima Anda mungkin mendorong lebih banyak orang untuk memilihnya sebagai jawaban yang baik. - Mark Booth
* batuk * tmuxisbetter * batuk * - crasic
tmux > layar. Cobalah, Anda tidak akan pernah kembali. - h0tw1r3
@TheLQ - byobu aku s Layar GNU. Anda masih menggunakan layar, hanya dengan skrip yang sangat khusus. - EEAA


Ada beberapa cara untuk melakukan ini, tetapi yang saya anggap paling berguna adalah menggunakan Layar GNU.

Setelah Anda ssh masuk, jalankan screen. Ini akan memulai shell lain yang berjalan di dalam layar. Jalankan perintah Anda, lalu lakukan a Ctrl-Sebuah  d.

Ini akan "memutuskan" Anda dari sesi layar. Pada titik ini, Anda dapat keluar atau melakukan hal lain yang Anda inginkan.

Saat Anda ingin menghubungkan kembali ke sesi layar, jalankan saja screen -RD dari prompt shell (sebagai pengguna pengguna yang sama yang membuat sesi).


92
2017-09-15 06:07



Luar biasa! Jawaban yang rapi, terima kasih ... - rahmanisback
Layar memiliki banyak sekali perintah, semuanya dimulai dengan Ctrl-a. Jika Anda hanya belajar satu ekstra, mulailah dengan "Ctrl-a?". Maka Anda tidak akan belajar "Ctrl-a c" dan "Ctrl-a n" - olafure
@olafure +1, terima kasih. Sepertinya Layar akan menjadi toolbox utama saya. - rahmanisback
tmux > layar. Cobalah, Anda tidak akan pernah kembali. - h0tw1r3
+1 untuk tmux. Saya menyerah layar 5 minggu yang lalu. - Bryan Hunt


Di bash, yang disown kata kunci sangat cocok untuk ini. Pertama, jalankan proses Anda di latar belakang (baik digunakan &, atau ^Z lalu ketikkan bg):

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

Dengan mengetik jobs Anda dapat melihat bahwa proses tersebut masih dimiliki oleh shell:

$ jobs
[1]+  Running  wget

Jika Anda logout pada titik ini, tugas latar belakang juga akan terbunuh. Namun, jika Anda berlari disown, bash melepaskan pekerjaan dan memungkinkannya untuk terus berjalan:

$ disown

Anda dapat mengonfirmasi ini:

$ jobs
$ logout

Anda bahkan bisa menggabungkan & dan disown pada baris yang sama, seperti:

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

Ini lebih baik daripada berlari nohup menurut saya karena tidak pergi nohup.out file dikotori seluruh sistem file Anda. Juga, nohup harus dijalankan sebelum Anda menjalankan perintah - disown dapat digunakan jika Anda hanya memutuskan nanti bahwa Anda ingin latar belakang dan melepaskan tugas.


70
2017-09-15 12:27



Itu jawaban yang sangat bagus, 1+. Satu-satunya preferensi untuk nohup atau Screen adalah independensi bash, dan bisa digunakan dengan shell lain. Tapi saya akan tetap berpegang pada pendekatan Anda setiap kali saya menggunakan bash. - rahmanisback
Ya - ini spesifik-bash, karena bash adalah satu-satunya shell yang pernah saya gunakan. Saya ingin tahu apakah shell lain mendukung sesuatu yang serupa (yaitu meluncurkan di latar belakang tanpa nohup) - akan sangat fantastis jika seseorang dapat memposting jawaban lain untuk shell lain. - Jeremy Visser
lihat jawaban saya menunjukkan bagaimana melakukannya dengan sh-lookalike - w00t
+1 karena dapat memutuskan nanti. Saat ini saya memiliki kebutuhan untuk ini. bekerja seperti yang diiklankan - code_monk


Alat nohup, tersedia di sebagian besar kotak Linux akan melakukan ini.


37
2017-09-15 06:14



Ini adalah jawaban yang paling sederhana. Setiap output dari secara otomatis diarahkan ke nohup.out dan dapat diperiksa nanti. - Julian
nohup tidak membutuhkan zsh sama sekali. - Aaron Brown
nohup adalah jawaban yang benar, itu singkat untuk tidak ada hangup. - Kinjal Dixit
nohup ditemukan di banyak mesin kemudian layar, jadi Anda harus tahu cara menggunakannya. - Zenon


Hanya untuk teliti, saya akan tunjukkan tmux, yang memiliki ide dasar yang sama dengan layar:

tmux dimaksudkan untuk menjadi alternatif yang modern, berlisensi BSD untuk program seperti layar GNU. Fitur utama termasuk:

  • Antarmuka perintah yang kuat, konsisten, terdokumentasi dengan baik dan mudah skrip.
  • Sebuah jendela dapat dibagi secara horizontal dan vertikal ke dalam panel.
  • Panel dapat dipindahkan dan diubah ukurannya dengan mudah, atau diatur ke dalam tata letak yang telah ditetapkan.
  • Dukungan untuk terminal UTF-8 dan 256-warna.
  • Salin dan tempel dengan beberapa buffer.
  • Menu interaktif untuk memilih jendela, sesi, atau klien.
  • Ubah jendela saat ini dengan mencari teks di target.
  • Penguncian terminal, secara manual atau setelah batas waktu.
  • Basis kode berlisensi BSD yang bersih, mudah diperpanjang, dalam pengembangan aktif.

Namun demikian, kurang lebih jauh lebih mudah untuk mencari di Google.


27
2017-09-15 06:23



Menggunakan "gnu screen" karena permintaan pencarian Anda bekerja dengan baik. - gnur
+1000 untuk tmux! - mbq


Layar terlalu berlebihan untuk menjaga proses tetap berjalan saat Anda keluar.

Mencoba dtach:

dtach adalah program yang ditulis dalam C yang mengemulasi fitur detach dari   layar, yang memungkinkan suatu program untuk dieksekusi di lingkungan itu   dilindungi dari terminal pengendali. Misalnya, programnya   di bawah kendali dtach tidak akan terpengaruh oleh keberadaan terminal   terputus karena suatu alasan.

dtach ditulis karena layar tidak cukup memenuhi kebutuhan saya; saya   tidak membutuhkan fitur tambahan layar, seperti dukungan untuk banyak   terminal atau dukungan emulasi terminal. layarnya juga terlalu besar,   besar, dan memiliki kode sumber yang sulit dimengerti.

layar juga mengganggu penggunaan aplikasi layar penuh seperti   emacs dan ircII, karena interpretasi yang berlebihan dari aliran   antara program dan terminal terlampir. dtach tidak memiliki file   terminal emulasi lapisan, dan melewati aliran keluaran mentah dari   program ke terminal terlampir. Satu-satunya input yang memproses itu   dtach tidak melakukan pemindaian untuk karakter detach (yang memberi sinyal   dtach untuk melepaskan dari program) dan memproses kunci suspend   (yang mengatakan dtach untuk sementara menangguhkan dirinya sendiri tanpa mempengaruhi   menjalankan program), dan keduanya dapat dinonaktifkan jika diinginkan.

Bertentangan dengan layar, dtach memiliki fitur minimal, dan sangat kecil.   Hal ini memungkinkan dtach untuk lebih mudah diaudit untuk bug dan keamanan   lubang, dan membuatnya dapat diakses di lingkungan di mana ruang terbatas,   seperti pada disk penyelamat.


11
2017-09-15 15:06



Terima kasih. Saya datang ke sini hanya untuk memposting tentang dtach juga. Ini adalah hal yang harus saya lakukan untuk pelepasan terminal sekarang; layar tidak terlalu banyak, dan mengganggu masukan ke tingkat yang konyol. Layar fakta membutuhkan termcap sendiri cukup meresahkan. - fluffy


Berikut ini cara untuk mendemonstrasikan proses shell apa pun, tidak ada program eksternal yang diperlukan:

( while sleep 5; do date; done ) <&- >output.txt &

Ketika Anda kemudian menutup sesi Anda, pekerjaan akan terus berjalan sebagaimana dibuktikan oleh file output.txt (yang memiliki buffering sehingga perlu waktu untuk menunjukkan tidak nol). Jangan lupa untuk membunuh pekerjaan Anda setelah pengujian.

Jadi yang perlu Anda lakukan hanyalah menutup stdin dan melatarbelakangi pekerjaan. Untuk menjadi sangat baik, pertama cd / jadi kamu tidak memegang tunggangan.

Ini bekerja bahkan dalam sh sederhana di bawah Solaris.


9
2017-09-16 16:48



Menarik. Itu muncul beberapa pertanyaan penting. Saya dapat melihat bahwa Anda mengatur STDIN menjadi tidak ada, - operator? Apa perbedaan antara < /dev/null dan &- ? Saya kira STDIN itu (dan orang lain STDOUT dan STDERR) dapat ditugaskan baik oleh file < file, atau aliran dengan <& stream dalam kasus STDIN. Apakah akan sama menggunakan < /dev/null dalam contoh Anda di atas? Dan Apakah operator - di atas merujuk ke nol sebagai aliran? - rahmanisback
Ketika Anda melakukan x <& -, yang menutup file descriptor x. Dalam hal ini tidak ada x, yang membuat bash default ke 1, yaitu input standar. Jika Anda menggunakan </ dev / null Anda tidak menutup stdin, Anda hanya memberikan file kosong ke program sebagai masukan. - w00t
Dan sejujurnya saya tidak benar-benar tahu mengapa ini mendemonstrasikan hal yang sedang Anda jalankan :-) Ini memang berhasil, kami menggunakannya dalam produksi. Saya menemukannya sambil mengaduk-aduk berharap saya bisa mendemonstrasikan proses di shell tanpa perlu sesuatu yang istimewa - jadi saya mulai dengan menutup stdin dan itu sudah cukup. Saya harus pergi membaca beberapa sumber shell tetapi saya menganggap bahwa jika Anda menutup stdin dan latar belakang proses, itu juga melepaskan proses. - w00t
Saya pikir alasannya adalah bahwa SIGHUP (sinyal sebenarnya yang menyebabkan anak berhenti ketika shell mati) dipicu ketika proses induk menutup pegangan stdin anaknya. Namun, jika stdin mulai keluar sebagai null, daripada ditutup setelah fakta, tidak ada jalan bagi orang tua untuk memicu SIGHUP. Nice menemukan, meskipun - tidak akan pernah memikirkan itu. - Jeremy Visser
@JeremyVisser yang terdengar sangat masuk akal! - w00t


Itu at Perintah dapat berguna untuk situasi semacam ini. Misalnya, ketik:

at now

Dan Anda kemudian dapat memasukkan perintah atau serangkaian perintah yang akan dijalankan. Hasilnya harus dikirim melalui email kepada Anda, jika e-mail sudah diatur dengan benar di mesin.

Dari pada now, Anda dapat menentukan waktu opsional dengan tanggal, atau ekspresi waktu seperti now + 15 minutes. Lihat man at untuk lebih jelasnya.


7
2017-09-16 08:23





byobu di Ubuntu adalah front-end yang bagus di layar. Dengan menekan Ctrl-? Anda mendapatkan daftar semua pintasan keyboard. Ini menambahkan status bar yang dapat berguna untuk menonton beban CPU, ruang disk, dll. Secara keseluruhan ini memberikan pengalaman yang saya akan gambarkan sebagai koneksi VNC berbasis terminal.

nohup memungkinkan memulai pekerjaan di latar belakang dengan outputnya diarahkan ke file log, yang selalu dapat dialihkan ke / dev / null jika tidak diperlukan.


7
2017-09-15 13:26