it-swarm-id.com

Bagaimana saya bisa menolak proses yang sedang berjalan dan menghubungkannya dengan shell layar baru?

Saya memiliki program yang sedang berjalan pada SSH Shell. Saya ingin menjeda dan dapat menghentikan sementara eksekusi ketika saya kembali.

Salah satu cara saya berpikir untuk melakukan itu adalah untuk mentransfer kepemilikannya ke layar Shell, sehingga tetap berjalan di sana.

Apakah ada cara lain untuk melanjutkan?

164
levesque

Menggunakan GNU screen adalah taruhan terbaik Anda.

Mulai layar berjalan ketika Anda pertama kali masuk - saya menjalankan screen -D -R, jalankan perintah Anda, dan putuskan atau tunda dengan CTRL-Z lalu lepaskan sambungan dari layar dengan menekan CTRL-A lalu D.

Saat Anda masuk lagi ke mesin, sambungkan kembali dengan menjalankan screen -D -R. Anda akan berada di Shell yang sama seperti sebelumnya. Anda dapat menjalankan jobs untuk melihat proses yang ditangguhkan jika Anda melakukannya, dan menjalankan %1 (atau masing-masing pekerjaan #) untuk mempelajarinya lagi.

88
Andrew Yochum

Anda dapat mencabut “kepemilikan” program dari Shell dengan disown bawaan:

# press Ctrl+Z to suspend the program
bg
disown

Namun ini hanya memberi tahu Shell untuk tidak mengirim sinyal SIGHUP 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 bekerja dengan mengemulasi terminal untuk setiap jendela, sehingga program-program tersebut dilampirkan ke jendela layar.)


Dimungkinkan untuk memasang kembali arsip yang diajukan ke file yang berbeda dengan melampirkan program dalam debugger (yaitu menggunakan ptrace ) dan membuatnya memanggil open, dup dan close. 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 ke Bagaimana saya bisa menolak proses yang sedang berjalan dan menghubungkannya dengan shell layar baru? dan Bisakah saya Nohup/menyaring proses yang sudah dimulai? =):

Untuk memindahkan proses antar terminal atau memasang kembali pembangkrutan, Anda dapat menggunakan mis. reptyr .

67
jofel

Solusi favorit saya adalah menggunakan tmux, Anda dapat melepaskan sesi, dan memasangnya kembali di terminal lain.

Ketika Anda terlepas dari sesi sebelumnya, Anda dapat dengan aman menutup terminal; nanti gunakan tmux attach untuk kembali ke sesi, bahkan jika Anda keluar.

28
daisy

Ada juga utilitas kecil bernama retty yang memungkinkan Anda memasang kembali program yang sedang berjalan ke terminal lain.

21
adamg

Saya tidak menggunakannya secara teratur, tetapi neercs klaim untuk mendukung ini. Ini adalah screen - seperti program dengan fitur mewah lain-lain seperti manajemen panel yang lebih baik, tetapi hal utama yang ditawarkannya adalah kemampuan untuk mengimpor suatu proses ke panel.

19
Michael Mrozek

Jika Anda hanya ingin menjeda dan memulai kembali setelahnya, Anda dapat menggunakan sinyal kill dengan STOP atau CONT.

Pada awalnya cari tahu proses PID dengan

$ ps aux

Kemudian kirim sinyal ke PID yang terdaftar untuk proses

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

"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:

Contoh 1: pindahkan irssi dari satu terminal ke terminal lainnya

Mungkin memindahkannya ke layar.

Pertama mulai irssi di satu terminal.

Jalankan injcode di terminal lain: $ injcode -m retty

Irssi sekarang harus dipindahkan ke terminal kedua, termasuk memiliki terminal pengendali baru.

9
user2688272

Ini bekerja untuk saya:

  1. bg proses
  2. jobs -l cari nomor proses
  3. tmux mulai manajer window Shell
  4. reptyr -L PROCESSNUMBER

reptyr's -L diperlukan agar ini berfungsi:

-L Like '-l', but also redirect the child's stdio to the slave.

karena kesalahan ini:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

Dan dengan -L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
1
kqw