Transfer perintah saat ini ke sesi yang dapat dilepas (tmux / layar)

41

Saat ini saya sedang menjalankan cadangan dan sekarang harus ditransfer ke yang dapat dilepas seperti pada tmuxatau screen. Apakah ada cara untuk melakukan ini ketika perintah sedang berjalan?

Saya dapat mengirim perintah latar belakang dengan menekan Ctrl+ Zdan memasangnya kembali dengan mengeluarkan fgperintah. tapi saya tidak tahu apakah sesi itu bisa kembali ketika saya keluar dari terminal.

Jürgen Paul
sumber
1
Tidak ada cara untuk melakukan itu. Anda harus memulai perintah dari dalam sesi layar (atau lainnya) agar dapat dilepas.
Dan D.

Jawaban:

45

Ini berfungsi, sebagian besar waktu:

Prasyarat: sudah reptyrdan tmux/ screenterpasang; Anda dapat menemukannya dengan apt-getatau yum, tergantung pada platform Anda.

  1. Gunakan Ctrl+ Zuntuk menunda proses.

  2. Lanjutkan proses di latar belakang dengan bg

  3. Temukan ID proses dari proses latar belakang jobs -l

    Anda akan melihat sesuatu yang mirip dengan ini:

    [1]+ 11475 Stopped (signal) yourprocessname
    
  4. Menolak pekerjaan dari induk saat ini (shell) dengan disown yourprocessname

  5. Mulai tmux(disukai), atau screen.

  6. Pasang kembali proses ke tmux/ screensesi dengan reptyr:

    reptyr 11475
    
  7. Sekarang Anda dapat melepaskan multiplexer (default Ctrl+ B, Duntuk tmux, atau Ctrl+ A, Duntuk screen), dan memutuskan koneksi SSH saat proses Anda berlanjut di tmux/ screen.

  8. Kemudian ketika Anda terhubung dengan SSH lagi, Anda dapat melampirkan multiplexer Anda (mis tmux attach.).

Ville
sumber
2
Sayangnya setelah berjalan, sudo reptyr 1430saya masih dapat: "... [-] Tidak dapat membuka tty pada anak. Tidak dapat melampirkan pid 1430: Izin ditolak"
Daryl Spitzer
3
Anda mungkin menemukan beberapa keberhasilan dengan opsi -L misalnya reptyr -L 1430 dalam kasus Anda.
cgseller
1
Jalankan ini bila perlu:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Yanhao
itu juga ada di Arch via yo: archlinux.org/packages/community/i686/reptyr (bukan apt-get atau yum)
Tommy
1
Setelah itu bg, proses harus berjalan di latar belakang, jadi jobsharus mengatakan Runningdaripada Stopped.
G-Man Mengatakan 'Reinstate Monica'
2

reptyr bagus tapi saya mendapat kesalahan izin

$ reptyr 30622

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

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

yang bekerja seperti pesona

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
keuangan fifi
sumber
2
Ketika saya menambahkan, -Lsaya mendapat pesan seperti milik Anda, Opened a new pty: /dev/pts/6tetapi penangguhan saya toptidak muncul di tmux. Apa yang kulewatkan di sini?
Mehrad Mahmoudian
-1

Anda dapat menggunakan disown untuk melepaskan pekerjaan dari terminalnya, jika perintah itu tersedia.

lebih aman untuk menjalankannya dengan nohup untuk memulai.

johnshen64
sumber
Dapatkah Anda memperluas ini? Apa maksud Anda memulainya nohup? Bagaimana cara disowningkerja suatu proses?
Darth Android
disown melepaskan proses latar belakang (yang Anda letakkan di latar belakang dengan kontrol-z) dari terminal sehingga proses akan berlanjut setelah terminal hilang. Anda bisa mengetikkan disown setelah control-z, jika perintah ditemukan. Namun ini secara teori dan mungkin tidak berfungsi dengan andal. lain kali lebih aman dengan menambahkan nohup di bagian depan program Anda sehingga Anda dapat keluar dari terminal dengan aman.
johnshen64
Saya menemukan 'tidak diakui' cukup tidak dapat diandalkan, seperti yang disebutkan. nohup tidak terlalu baik. reptyr mungkin menjadi solusi. github.com/nelhage/reptyr
anastrophe
Ini tidak menjawab pertanyaan. Pertanyaannya bukan hanya "bagaimana cara menutup terminal tanpa mematikan cadangan", tetapi "bagaimana saya melanjutkannya nanti". Jawaban yang benar adalah "Anda tidak bisa".
Gabe
Saya melihat kemungkinan perselisihan semantik di sini, dan ini adalah hasil pencarian yang cukup populer untuk kata kunci seperti 'relocatable', 'position-independent', 'detach tmux', dll. Jadi saya harap Anda dapat memaafkan necro-post. Apakah maksud Anda "Anda tidak bisa" karena pemetaan memori yang berbeda antara menghentikan program dan melanjutkannya? Program cadangan hanya akan tahu file apa yang akan dicadangkan oleh struktur file yang diberikan, dan struktur file ada untuk membuat memori fisik itu dapat dipetakan di masa mendatang. (Kami mendukung jika tidak!)
John P