Bagaimana saya bisa menutup terminal tanpa membunuh anak-anaknya (tanpa menjalankan `layar` terlebih dahulu)?

35

kadang-kadang saya menjalankan aplikasi di gnome-terminal, tetapi kemudian tiba-tiba saya harus me-restart gnome atau sesuatu. Saya kira jawaban untuk pertanyaan ini juga berguna maka saya ingin memutuskan sambungan dari SSH di mana sesuatu terjadi.

Pohon terminal Gnome terlihat seperti ini:

gnome-terminal
    bash
        some-boring-process

Bisakah saya 'lepas' bashdari gnome-terminal(atau lepas some-boring-processdari bash dan mengarahkan outputnya ke suatu tempat)? Jika saya baru saja membunuh gnome-terminal, bashakan dibunuh untuk semua subprosesnya

valya
sumber

Jawaban:

48

Jika some-boring-processsedang berjalan di sesi bash Anda saat ini:

  1. hentikan dengan ctrl-zmemberi Anda bash prompt
  2. letakkan di latar belakang dengan bg
  3. catat nomor pekerjaan, atau gunakan jobsperintah
  4. lepaskan proses dari sesi bash ini dengan disown -h %1(gantikan nomor pekerjaan yang sebenarnya di sana).

Itu tidak melakukan apa-apa untuk mengarahkan output - Anda harus memikirkan itu ketika Anda memulai proses membosankan Anda. [Sunting] Tampaknya ada cara untuk mengarahkan ulang https://gist.github.com/782263

Tapi serius, lihat ke layar. Saya memiliki shell di server jauh yang telah berjalan selama berbulan-bulan.

glenn jackman
sumber
Terima kasih. Saya memilih jawaban Anda karena itu satu-satunya yang menjawab pertanyaan (itu tentang proses yang sudah berjalan). Saya sudah menggunakan screenkadang - kadang, meskipun memiliki masalah dan saya tidak ingin menggunakannya untuk setiap sesi pesta dalam hidup saya
valya
Anda tidak menggunakannya untuk setiap sesi bash, tetapi untuk setiap mesin jarak jauh tempat Anda menghabiskan banyak waktu.
Glenn Jackman
Saya mengambil kebebasan untuk menambahkan informasi tentang mengarahkan output, silakan tinjau!
valya
[root @ server ~] # bg -bash: bg: saat ini: tidak ada pekerjaan seperti itu
Muhammad Dyas Yaskur
Kenapa saya bisa bash: bg: current: no such job ?
Muhammad Dyas Yaskur
10

Inilah yang dibuat untuk layar dan tmux . Anda menjalankan shell di dalam sesi layar / tmux, dan Anda dapat memutuskan / menghubungkan kembali sesuka hati. Anda juga dapat menjalankan beberapa sesi shell di dalam satu terminal gnome.

jsbillings
sumber
Terima kasih, tetapi, ketika saya mengomentari jawaban yang diterima: 1. pertanyaannya adalah tentang proses yang sudah berjalan. 2. screenmemiliki masalah dan saya tidak ingin menggunakannya untuk setiap sesi bash dalam hidup saya
valya
6

screen,, tmuxatau dtach(mungkin dengan dvtm) semuanya bagus untuk ini, tetapi jika itu adalah sesuatu di mana Anda tidak berpikir untuk menggunakan salah satunya, Anda mungkin dapat memanfaatkan nohup.

Hank Gay
sumber
Terima kasih, tetapi, ketika saya mengomentari jawaban yang diterima: 1. pertanyaannya adalah tentang proses yang sudah berjalan. 2. screenmemiliki masalah dan saya merasa tidak ingin menggunakannya untuk setiap sesi pesta dalam hidup saya
valya
@valya Senang Anda menemukan solusi. Hanya untuk menjadi jelas, meskipun, nohupbekerja pada proses yang berjalan dengan menggunakan -popsi (jika tersedia)
Hank Gay
@Hank Gay: Saya tidak bisa melihat -popsi nohupdi halaman manual; sistem apa yang Anda pakai?
Mikel
@Mikel Sebelum saya belajar untuk berhenti mengkhawatirkan dan mencintai tmux, saya menggunakan -popsi pada kotak Solaris. Saya juga memiliki kenangan samar melakukannya di kotak CentOS mongrel (mungkin zshmemiliki builtin yang mendukungnya?), Tetapi saya tidak dapat menemukan dokumen tentang hal itu.
Hank Gay
@Hank Gay: Baik bashatau zshpada sistem Ubuntu Linux saya memberikan nohup.
Mikel
4

Jika Anda ingin terus berinteraksi dengan proses anak daripada hanya latar belakang dan terus berjalan, sebenarnya ada program yang disebut retty yang merupakan bukti-konsep untuk "mencuri" proses dari tty saat ini dan menempel kembali ke yang sekarang.

Namun, ia melakukan beberapa hal mengerikan, termasuk menempelkan beberapa kode rakitan ke tumpukan aplikasi yang dipasang kembali. Dan kode itu belum diperbarui untuk x86_64.

Ada program lain yang mengambil pendekatan yang mungkin lebih baik, membekukan proses di ruang pengguna ke file, yang kemudian dapat dipulihkan (mungkin pada tty lain.) Ini cryopid , dan proyek itu juga tampaknya telah berhenti di fase proof-of-concept, dan tidak bekerja dengan Linux modern sebagai kode. Baiklah

Hanya berpikir ini seharusnya ada di sini untuk kelengkapan. Jika Anda tidak keberatan menggunakan voodoo yang mengerikan, ini berada dalam bidang kemungkinan - setidaknya, kemungkinan teoretis.

mattdm
sumber
1
itu mengingatkan saya pada gist.github.com/782263 ... oh, inti itu tampaknya menjawab pertanyaan saya juga
valya
2

Jika saya menjalankan sesuatu yang ingin saya selesaikan tidak peduli apa (singkatnya reboot sistem), saya menggunakan nohupdan menjalankannya di latar belakang. Tidak seperti layar dan sejenisnya Anda tidak dapat memasang kembali ke proses. Namun, pengalihan pengalihan di tempat lain output apa pun dapat ditemukan di nohup.out.

Saya menggunakan screen ketika saya ingin dapat beralih terminal untuk suatu proses. Seperti memulai proses dari rumah / kerja dan beralih ke yang lain. Seperti keluaran sesi terminal lainnya, gulir akhirnya akan keluar dari bagian atas buffer.

EDIT: Jika Anda telah meluncurkan proses, Anda dapat disownmemproses untuk mencegah HUPsinyal dikirim ketika proses ditutup.

BillThor
sumber
Terima kasih, tetapi, ketika saya mengomentari jawaban yang diterima: 1. pertanyaannya adalah tentang proses yang sudah berjalan. 2. screenmemiliki masalah dan saya merasa tidak ingin menggunakannya untuk setiap sesi pesta dalam hidup saya
valya
@valya Saya telah melihat referensi untuk memutuskan proses yang sedang berjalan dari grup program. Saya tidak tahu ada alat untuk melakukannya. Alat ini mungkin perlu mengarahkan saluran IO std juga. Saya pikir saya mungkin berhasil sekali, tetapi memutuskan nohup lebih sederhana.
BillThor
1

Anda dapat membuat proses (PID) tidak menerima sinyal HUP ketika sesi terminal berakhir. Gunakan perintah berikut:

nohup -p PID
tony
sumber
nohup: invalid option -- 'p'. Versi apa nohupyang Anda jalankan pada sistem seperti apa?
Anthon
Saya kebanyakan menggunakan Solaris dan AIX. Untuk Linux, Anda harus memeriksa perintah disown.
tony
Ya, tidak ada -ppilihan di Linux, jadi jawaban ini khusus untuk Solaris dan AIX. Senang tahu
Sergiy Kolodyazhnyy
1

Script ini melepaskan proses anak dari orang tua dan menugaskannya ke proses init :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
mark_infinite
sumber