Pindahkan program yang dimulai di layar GNU ke terminal lain

21

Saya ingin mengakhiri sebuah instance GNU screensambil mempertahankan proses yang berjalan di dalamnya.

Jadi saya membuka program emulator terminal reguler saya dan menjalankan layar. Kemudian saya menggunakan instance screenuntuk mengeksekusi ./script_x.sh. Sekarang, untuk alasan apa pun, saya ingin berhenti menggunakan screennamun script_x.shbelum menyelesaikan tugasnya dan saya tidak mau kehilangan kemajuan saya.

Bisakah saya menjaga proses aktif tetap hidup agar terus bekerja di dalam emulator terminal reguler saya?

suara-suara
sumber
14
Apakah Anda benar-benar ingin mematikan layar atau Anda ingin melepaskannya? Layar dimaksudkan untuk digunakan untuk menjalankan proses di latar belakang sehingga Anda dapat melanjutkan sesi normal Anda, juga memungkinkan aplikasi tetap berjalan setelah Anda keluar (mis. Putuskan sambungan sesi SSH Anda). Anda selalu dapat melepaskan diri dari layar, melanjutkan sesi normal dan mengambil tempat yang tersisa di sesi layar. Emulator terminal Anda tidak ada hubungannya dengan ini.
BlueCacti
Atau cukup buat layar lain di dalam screensesi.
chrylis -on strike-
11
Pertanyaan-pertanyaan ini berbau seperti Masalah XY .
Digital Chris
7
@ tjt263 - Anda mengatakan Anda menyesal menggunakan layar, jadi apa yang akan Anda lakukan agar proses Anda tetap berjalan jika Anda tidak menggunakan layar? Anda masih dapat melakukan hal yang sama dengan proses di layar, tetapi layar memiliki keuntungan tambahan adalah Anda dapat melepaskannya dan membiarkan proses Anda berjalan tanpa gangguan.
Johnny
@DigitalChris Itu mungkin dilakukan sekarang. Saya merasa bahwa judul aslinya lebih mungkin lebih relevan. Ada 3 poin berbeda: Saya menjalankan program di dalamnya screen. Saya ingin berhenti menggunakan screen. Saya tidak ingin menghentikan program yang sedang berjalan di dalam screen. Itu dia. Saya tidak tahu bagaimana mengklarifikasi situasi atau mengungkapkannya lebih sederhana dari ini.
Suara

Jawaban:

31

TLDR: Jawaban praktis: Tidak.

Jawaban yang lebih panjang:

Secara teori Anda bisa. Jika Anda memulai sesuatu seperti nohup myprog &dari dalam layar maka itu akan terus berjalan. Ini akan mengabaikan sinyal hangup dan tidak akan memiliki input apa pun, tetapi dalam teori Anda dapat terus bekerja dengannya.

Dalam praktiknya ini tidak terjadi. Jadi, kecuali jika Anda ingin melampirkan debugger ke proses yang sedang berjalan dan menulis ulang penanganan file dan memastikan bahwa proses tersebut menangani sinyal -1 ketika Anda menutup layar ... maka jawabannya adalah tidak.

Jika Anda siap melakukan ini, saya memiliki bookmark di rumah yang menunjuk ke [SU] di mana seseorang melakukan hal itu . Disimpan untuk kedahsyatan, bukan karena mudah dan sepele untuk dilakukan.

Hennes
sumber
Perhatikan bahwa pertanyaan telah diedit secara massal sejak jawaban Anda.
chrylis -on strike-
Memutuskan suatu proses cukup mudah - ini adalah masalah pengaturan kelompok proses (dengan disownatau pada tingkat yang lebih rendah) sehingga tidak SIGHUPakan dikirim ketika proses induk mati. Menghubungkan kembali i / o adalah hal lain sama sekali - di situlah debugger masuk.
alexis
Anda tidak perlu nohupjika Anda berada di shell kontrol pekerjaan (seperti bash, ksh, csh, zsh, ash, dll). Jika Anda masih menggunakan shell kontrol non-pekerjaan seperti Bourne, shmungkin sekarang saatnya untuk meningkatkan.
anak ayam
23

Anda dapat mencoba menggunakan reptyruntuk memasang kembali aplikasi yang sudah berjalan ke terminal yang berbeda. Ini memiliki beberapa masalah dengan proses pengiriman ke latar belakang.

Saya baru saja mengujinya (mulai htopdi dalam screen, reptyrke terminal lain, membunuh screen), dan sepertinya berfungsi dengan baik. Tetap ini solusi yang benar-benar gila, jadi tidak ada jaminan.

sebuah daratan
sumber
1
Lebih sedikit peretasan daripada menggunakan gdb :)
Hennes
14

Ya (jika "membunuh" tidak benar-benar membunuh), sebenarnya itulah gunanya layar. Anda harus memeriksa manual dan mencoba yang mana yang sesuai dengan kebutuhan Anda:

C-a d
C-a C-d     (detach)      Detach screen from this terminal.

C-a D D     (pow_detach)  Detach and logout.

Maka yang Anda butuhkan adalah opsi baris perintah -D / -d -R / -r layar, tergantung pada pilihan Anda.

Gombai Sándor
sumber
1
Ini tidak menjawab pertanyaan. OP tidak ingin melepaskan dari layar, mereka ingin menghentikan proses layar.
Guntram Blohm mendukung Monica
6
Ya, dia menulis itu, tetapi saya tidak yakin dia bertanya apa yang dia inginkan.
Gombai Sándor
11
@ GuntramBlohm Sama sekali tidak jelas bahwa OP memahami cara kerja layar, dan ini adalah efek yang paling mungkin diinginkan.
chrylis -on strike-
2
Tahukah Anda bahwa layar bukanlah terminal yang berbeda dari xterm tetapi sebuah lapisan (terminal semu) yang dapat dilampirkan ke terminal Anda yang sebenarnya (vterm, xterm, terminator, (m) rxvt, any) setelah melepaskannya dari terminal lain? Dan layar adalah apa yang membuat proses Anda berjalan yang Anda mulai di dalam layar (dan itu melakukannya dengan baik). Jika Anda membunuh (benar-benar membunuh) layar, maka Anda menarik karpet dari bawah proses Anda ... Saya hanya tidak melihat alasan bagus mengapa Anda melakukannya.
Gombai Sándor
1
@ GombaiSándor: Salah satu alasan untuk ingin melakukan itu adalah membuat proses berbicara langsung ke terminal agar dapat melewati kemampuan yang tidak diketahui layar. Sebagai contoh, saya pernah meretas versi xterm saya sendiri untuk membuat semua tombol fungsi aneh pada keyboard saya mengirim urutan melarikan diri yang mencakup keysym X11 dan keadaan pengubah penuh, daripada mencoba berpura-pura itu adalah VT102 - dan kemudian mulai menginstal keybindings untuk mereka di emacs. Urutan-urutan itu tidak akan melewati layar tanpa terluka.
Henning Makholm