Saya memiliki program yang berjalan pada shell SSH. Saya ingin menjeda dan dapat menghentikan sementara eksekusi ketika saya kembali.
Salah satu cara saya berpikir untuk melakukan itu adalah untuk mentransfer kepemilikannya ke shell layar, sehingga tetap berjalan di sana.
Apakah ada cara lain untuk melanjutkan?
ssh
terminal
gnu-screen
job-control
disown
levesque
sumber
sumber
Jawaban:
Menggunakan GNU
screen
adalah taruhan terbaik Anda.Mulai layar berjalan ketika Anda pertama kali masuk - saya menjalankan
screen -D -R
, menjalankan perintah Anda, dan putuskan atau tunda denganCTRL-Z
dan kemudian putuskan dari layar dengan menekanCTRL-A
kemudianD
.Saat Anda masuk lagi ke mesin, sambungkan kembali dengan menjalankan
screen -D -R
. Anda akan berada di shell yang sama seperti sebelumnya. Anda dapat menjalankanjobs
untuk melihat proses yang ditangguhkan jika Anda melakukannya, dan menjalankan%1
(atau pekerjaan masing-masing #) untuk foreground lagi.sumber
Anda dapat mencabut "kepemilikan" program dari shell dengan
disown
built-in:Namun ini hanya memberi tahu shell untuk tidak mengirim
SIGHUP
sinyal ke program ketika shell keluar. Program akan mempertahankan koneksi apa pun yang dimilikinya dengan terminal, biasanya sebagai input standar, output dan stream error. Tidak ada cara untuk memasang kembali mereka ke terminal lain. ( Layar berfungsi dengan mengemulasi terminal untuk setiap jendela, sehingga program-programnya melekat pada jendela layar.)Dimungkinkan untuk memasang kembali arsip yang diajukan ke file yang berbeda dengan melampirkan program dalam debugger (yaitu menggunakan
ptrace
) dan membuatnya memanggilopen
,dup
danclose
. Ada beberapa alat yang melakukan ini; ini adalah proses yang rumit, dan kadang-kadang mereka malah menghentikan proses itu. Kemungkinannya termasuk (tautan yang dikumpulkan dari jawaban untuk Bagaimana saya bisa menolak proses yang sedang berjalan dan menghubungkannya dengan shell layar baru? Dan Dapatkah saya nohup / menyaring proses yang sudah dimulai? ):sumber
disown
menghapus proses dari daftar kontrol-pekerjaan.disown -h
?fg
ataukill
tidak, dan lihat apakah itu berakhir sendiri.bzcat a.bz2 | grep text
)? Man forreptyr
mengatakan bahwa itu tidak mendukung memindahkan proses dengan anak-anak.Untuk memindahkan proses antar terminal atau untuk memasang kembali pembangkrutan, Anda dapat menggunakan mis . Reptyr .
sumber
screen
jawaban yang diterima tentu saja ideal, itu tidak benar-benar menjawab pertanyaan, yang secara khusus meminta cara untuk memindahkan proses yang sedang berjalan kescreen
atau sejenisnya. Lihat juga jawaban ini: serverfault.com/a/284795Solusi favorit saya adalah menggunakan
tmux
, Anda dapat melepaskan sesi, dan melampirkannya kembali di terminal lain.Ketika Anda terlepas dari sesi sebelumnya, Anda dapat menutup terminal dengan aman; nanti gunakan
tmux attach
untuk kembali ke sesi, bahkan jika Anda keluar.sumber
Ada juga utilitas kecil bernama retty yang memungkinkan Anda memasang kembali program yang sedang berjalan ke terminal lain.
sumber
Saya tidak menggunakannya secara teratur, tetapi neercs mengklaim untuk mendukung ini. Ini adalah
screen
-seperti program dengan aneka fitur mewah seperti manajemen panel yang lebih baik, tetapi hal utama yang ditawarkannya adalah kemampuan untuk mengimpor proses ke dalam panelsumber
ptrace
), tetapi itu tidak hanya memanipulasi deskriptor file, itu garpu proses. Itu bisa diraihfind /
, tetapi gagal di bash interaktif.Jika Anda hanya ingin pause dan restart setelah itu, Anda dapat menggunakan
kill
denganSTOP
atauCONT
sinyal.Pada awalnya cari tahu proses PID dengan
Kemudian kirim sinyal ke PID yang terdaftar untuk proses
sumber
"injcode" dari ThomasHabets tampaknya persis seperti yang saya butuhkan:
https://github.com/ThomasHabets/injcode
Program injcode memungkinkan kode sewenang-wenang untuk disuntikkan ke dalam proses yang berjalan, apakah Anda tahu sebelumnya dan sedang menjalankan layar atau tmux
Dari README:
sumber
Ini bekerja untuk saya:
bg
prosesjobs -l
cari nomor prosestmux
mulai shell window managerreptyr -L PROCESSNUMBER
reptyr
's-L
yang diperlukan untuk mendapatkan ini untuk bekerja:-L Like '-l', but also redirect the child's stdio to the slave.
karena kesalahan ini:
Dan dengan -L
sumber