Menjaga proses linux tetap berjalan setelah saya keluar

142

Saya terhubung ke mesin Linux melalui SSH, dan saya mencoba menjalankan skrip bash yang berat yang membuat operasi sistem file. Ini diharapkan tetap berjalan selama berjam-jam, tetapi saya tidak bisa membiarkan sesi SSH terbuka karena masalah koneksi internet yang saya miliki.

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

doc_id
sumber

Jawaban:

135

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


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

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

Dua multiplexer terminal yang populer adalah layar dan tmux .

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


The HUP sinyal (atau SIGHUP) dikirim oleh terminal untuk semua proses anak ketika terminal ditutup. Tindakan umum setelah menerima SIGHUP adalah untuk mengakhiri. 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 nohupdan disown.

Untuk informasi lebih lanjut tentang bagaimana nohupdan cara disownkerjanya, baca pertanyaan dan jawaban ini: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Catatan: meskipun proses akan tetap berjalan Anda tidak dapat lagi berinteraksi dengan mereka karena mereka tidak lagi melekat pada terminal apa pun. Metode ini terutama berguna untuk proses batch yang berjalan lama yang, setelah dimulai, tidak lagi memerlukan input pengguna.

lesmana
sumber
3
Saya suka jawaban ini karena memberikan solusi untuk situasi interaktif dan non-interaktif. Dalam kasus interaktif, screenmemberi Anda lebih banyak opsi, tetapi jika Anda menggunakan authorized_keysuntuk memungkinkan orang menjalankan skrip dari jarak jauh ssh, nohupopsinya adalah cara sederhana yang bagus untuk skrip untuk memulai proses yang lebih lama dari sshsesi yang digunakan untuk memulai mereka .
Mark Booth
1
@rahmanisback - Ingatlah bahwa Anda dapat mengubah jawaban yang diterima kapan saja. Hanya karena sejauh ini jawaban EricA dipilih paling tinggi tidak berarti itu adalah jawaban terbaik untuk Anda, memang menjadikannya jawaban Anda yang diterima mungkin mendorong lebih banyak orang untuk memilihnya sebagai jawaban yang baik.
Mark Booth
3
* cough * tmuxisbetter * cough *
crasic
3
tmux > layar. Cobalah, Anda tidak akan pernah kembali.
h0tw1r3
1
@TheLQ - byobu adalah Layar GNU. Anda masih menggunakan layar, hanya dengan .screenrc yang sangat disesuaikan.
EEAA
92

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

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

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

Saat Anda ingin menyambung kembali ke sesi layar, jalankan saja screen -RDdari prompt shell (seperti pengguna yang sama yang membuat sesi).

EEAA
sumber
6
Layar memiliki sejumlah besar perintah, semua 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 kotak alat utama saya.
doc_id
tmux > layar. Cobalah, Anda tidak akan pernah kembali.
h0tw1r3
+1 untuk tmux. Saya menyerah layar 5 minggu yang lalu.
Bryan Hunt
73

Dalam bash, disownkata kunci sangat cocok untuk ini. Pertama, jalankan proses Anda di latar belakang (gunakan &, atau ^Zketik bg):

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

Dengan mengetik, jobsAnda dapat melihat bahwa proses tersebut masih dimiliki oleh shell:

$ jobs
[1]+  Running  wget

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

$ disown

Anda dapat mengkonfirmasi ini:

$ jobs
$ logout

Anda bahkan dapat menggabungkan &dan disownpada baris yang sama, seperti:

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

Ini lebih baik daripada berjalan nohupmenurut saya karena tidak meninggalkan nohup.outfile berserakan di seluruh sistem file Anda. Juga, nohupharus dijalankan sebelum Anda menjalankan perintah - disowndapat digunakan jika Anda hanya memutuskan nanti bahwa Anda ingin latar belakang dan melepaskan tugas.

Jeremy Visser
sumber
1
Itu jawaban yang sangat bagus, 1+. Satu-satunya preferensi untuk nohup atau Screen adalah independensi bash, dan dapat digunakan dengan shell lain. Tapi saya akan tetap pada pendekatan Anda setiap kali saya menggunakan bash.
doc_id
Ya - ini khusus untuk bash, karena bash adalah satu-satunya shell yang pernah saya gunakan. Saya bertanya-tanya apakah cangkang lain mendukung sesuatu yang serupa (yaitu meluncurkan di latar tanpa nohup) - akan luar biasa jika seseorang dapat memposting jawaban lain untuk cangkang lain.
Jeremy Visser
1
lihat jawaban saya yang menunjukkan bagaimana melakukannya dengan sh-lookalike
w00t
1
+1 karena dapat memutuskan nanti. Tepat saat ini saya membutuhkan ini. bekerja seperti yang diiklankan
code_monk
37

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

Korjavin Ivan
sumber
1
Sejauh ini, inilah jawaban yang paling sederhana. Setiap output dari secara otomatis diarahkan ke nohup.out dan dapat diperiksa nanti.
Julian
3
nohup tidak memerlukan zsh sama sekali.
Aaron Brown
nohup adalah jawaban yang benar, itu singkat tanpa hangup.
Kinjal Dixit
2
nohup ditemukan pada lebih banyak mesin daripada layar, jadi Anda harus tahu cara menggunakannya.
Zenon
27

Untuk lebih menyeluruh, saya akan tmux , yang memiliki ide dasar yang sama dengan layar:

tmux dimaksudkan sebagai alternatif modern, berlisensi BSD untuk program seperti layar GNU. Fitur utama meliputi:

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

Namun, kira-kira jauh lebih mudah untuk mencari di Google.

Handyman5
sumber
2
Menggunakan "gnu screen"sebagai permintaan pencarian Anda bekerja dengan sangat baik.
gnur
4
+1000 untuk tmux!
mbq
11

Layar berlebihan untuk hanya menjaga proses berjalan saat Anda logout.

Coba coba :

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

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

layar juga mengganggu penggunaan aplikasi layar penuh saya seperti emacs dan ircII, karena interpretasinya yang berlebihan dari aliran antara program dan terminal yang terpasang. dtach tidak memiliki lapisan emulasi terminal, dan meneruskan aliran output mentah program ke terminal yang terpasang. Satu-satunya pemrosesan input yang dilakukan dtach adalah memindai karakter detach (yang memberi sinyal dtach untuk melepaskan dari program) dan memproses kunci penangguhan (yang memberitahu dtach untuk sementara menangguhkan dirinya sendiri tanpa mempengaruhi program yang sedang berjalan), dan keduanya dapat keduanya dinonaktifkan jika diinginkan.

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

sml
sumber
Terima kasih. Saya datang ke sini hanya untuk memposting tentang dtach juga. Ini tugas saya untuk detasemen terminal sekarang; Layar CARA terlalu banyak, dan mengganggu input ke tingkat yang konyol. Layar fakta membutuhkan termcap sendiri cukup mengganggu.
fluffy
9

Berikut adalah cara untuk mengubah proses shell apa pun, tidak diperlukan program eksternal:

( 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 dibutuhkan beberapa saat untuk menunjukkan bukan-nol). Jangan lupa untuk membunuh pekerjaan Anda setelah pengujian.

Jadi yang perlu Anda lakukan adalah menutup stdin dan latar belakang pekerjaan. Agar benar-benar bagus, pertama-tama cd /agar Anda tidak memegang tunggangan.

Ini bekerja bahkan dalam sh sederhana di bawah Solaris.

w00t
sumber
Menarik. Itu menimbulkan beberapa pertanyaan penting. Saya dapat melihat bahwa Anda mengatur STDIN menjadi nol, -operator? Apa perbedaan antara < /dev/nulldan &-? Saya menduga bahwa STDIN (dan yang lainnya STDOUT dan STDERR) dapat ditugaskan baik oleh file < file, atau streaming oleh <& streamdalam kasus STDIN. Apakah itu sama dengan menggunakan < /dev/nullcontoh Anda di atas? Dan apakah operator di -atas menyebut null sebagai arus?
doc_id
Ketika Anda melakukannya x <& -, itu akan menutup deskriptor file 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 input.
w00t
1
Dan jujur ​​saja, saya tidak benar-benar tahu mengapa ini memiringkan hal yang Anda jalankan :-) Tapi itu berhasil, kami menggunakannya dalam produksi. Saya menemukannya sambil bermain-main berharap saya bisa mengubah proses di shell tanpa perlu sesuatu yang istimewa - jadi saya mulai dengan menutup stdin dan itu sudah cukup. Saya harus membaca beberapa sumber shell tetapi saya berasumsi bahwa jika Anda menutup stdin dan melatarbelakangi prosesnya, itu juga akan menghilangkan prosesnya.
w00t
2
Saya pikir alasannya adalah bahwa SIGHUP (sinyal aktual yang menyebabkan anak berhenti ketika shell mati) dipicu ketika proses induk menutup pegangan stdin anaknya. Namun, jika stdin dimulai sebagai nol, daripada ditutup setelah fakta, tidak ada cara bagi orang tua untuk memicu SIGHUP. Nice find, meskipun - tidak akan pernah memikirkan itu.
Jeremy Visser
@ JeremyVisser yang terdengar sangat masuk akal!
w00t
7

The atperintah dapat berguna untuk situasi seperti 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 email sudah diatur dengan benar pada mesin.

Alih-alih now, Anda dapat menentukan waktu secara opsional dengan tanggal, atau ekspresi waktu seperti now + 15 minutes. Lihat man atuntuk lebih jelasnya.

rjmunro
sumber
7

byobudi Ubuntu adalah tampilan depan yang bagus untuk 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 akan saya gambarkan sebagai koneksi VNC berbasis terminal.

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

John Beckett
sumber