Bash / ZSH: Membatalkan 'tolak'

30

Apakah ada cara untuk 'memasang kembali' proses ke meja kerja shell setelah proses itu 'tidak diakui'?

Sunting: $ SEARCHENGINE benar-benar mengecewakan saya. Tidak terlihat terlalu bagus.

nisc
sumber

Jawaban:

16

Mempertimbangkan cara kerja linux dan proses kepemilikan, saya khawatir tidak mungkin untuk memiliki kembali suatu proses, tanpa bantuan dari proses adopsi.

Orang tua dapat 'menolak' seorang anak, yang kemudian 'diadopsi' oleh proses bernama 'init'. Keamanan sistem mencegah seseorang mengambil proses orang lain. Ketika Anda menolaknya, suatu proses menjadi milik orang lain (init) untuk dikendalikan. Anda sebagai 'pengguna' masih bisa mematikan proses, tetapi Anda tidak bisa mendapatkannya kembali. Mencoba memaksa init untuk mengembalikan proses Anda tidak akan berhasil, karena init bahkan tidak membaca email.

Seperti kedengarannya, itu benar-benar bermuara pada jawaban "Jangan lakukan itu!".

lornix
sumber
1
Ini tidak mungkin benar: proses induk tidak dapat menyebabkan anak diadopsi kecuali dengan keluar. Perilaku yang Anda gambarkan harus dipicu dari proses anak (atau oleh kernel, yang melakukan beberapa hal ini secara otomatis jika orang tua meninggal). Suatu proses tidak dapat mengadopsi anak secara sukarela tetapi juga tidak dapat melepaskannya.
Gilles 'SANGAT berhenti menjadi jahat'
1
Permintaan maaf saya. Salahku. Terlalu banyak disederhanakan. Berlari melalui sumber bash lagi, bash masih mempertahankan kepemilikan, tetapi menghambat sighup yang diturunkan ke proses anak. Jadi MUNGKIN dimungkinkan untuk mendapatkannya kembali, tetapi belum dibangun ke bash (belum). Untuk beberapa alasan saya terjebak pada init yang menuai anak yatim dan zombie.
lornix
@ lomix ya, tetapi ketika Anda keluar dari shell Anda melepaskannya dari, maka ia mendapatkan ppid dari 1. jadi alasan Anda valid. yang menyangkal kecuali mereka akan keluar pula: p
Orwellophile
1
Maaf, tapi jawaban ini salah. Cukup gunakan reptyr(lihat jawaban saya untuk contoh penggunaan).
Christian Pietsch
18

Meskipun saya berasumsi ini tidak membantu siapa pun yang berada dalam situasi yang tidak menguntungkan karena tidak mengakui proses yang salah, jika Anda ingin mengusir disangkal dari alur kerja Anda dan menggantinya dengan:

https://github.com/nelhage/reptyr

Anda akan dapat memperbaiki proses apa pun (mis. Pindahkan ke dalam layar).

Thom
sumber
2
Yah, saya mendapatkan kembali proses vim saya yang tidak diakui dengan reptyr, jadi itu berfungsi seperti utilitas yang tidak diakui yang saya cari.
hlovdal
Anda benar, @hlovdal: Jawaban ini setengah salah. reptyradalah solusinya, tetapi tidak perlu berhenti menggunakan disown. Untuk lebih jelasnya, saya telah menulis jawaban baru.
Christian Pietsch
11

Yang Anda butuhkan hanyalah reptyr. Ia hidup di GitHub dan telah dikemas untuk Debian sejak Wheezy, dan mungkin juga untuk distro GNU / Linux lainnya. Ini akan memproyeksikan proses penolakan Anda di terminal saat ini jika Anda memintanya dengan ID prosesnya (PID). Jadi misalnya:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here
Christian Pietsch
sumber
2
(sudo apt-get install reptyr) Kemudian dapatkan ini pada upaya pertama: "Kernel menolak izin saat melampirkan. Jika uid Anda cocok dengan target, periksa nilai / proc / sys / kernel / yama / ptrace_scope. Untuk informasi lebih lanjut, lihat /etc/sysctl.d/10-ptrace.conf "Saya mengubah nilai di kedua lokasi dari 1 menjadi 0 dan berhasil. Saya menguji penolakan dan reptyr dari proses sebagai pengguna yang sama (notebook ipython di ubuntu 14,04 LTS). Mungkin ini baik untuk pengembangan di lingkungan yang terisolasi ... namun tidak yakin konsekuensi keamanan tertinggi dari perubahan tersebut. Mungkin seseorang dengan keahlian dapat
berbaur
1

Maaf tidak. Pada prinsipnya, itu mungkin, karena penolakan hanya mengubah beberapa keadaan internal shell - pada dasarnya menghapus ID proses dari daftar, dan itu dapat dimasukkan kembali tanpa terlalu banyak kesulitan (Anda harus sedikit berhati-hati dalam menguji bahwa pid yang disambungkan kembali berada di sesi yang benar, tetapi itu tidak dapat diatasi). Tetapi tidak ada shell yang biasa (bash, ksh, tcsh, zsh) tampaknya memiliki cara untuk menambahkan kembali. (Meskipun dengan zsh Anda dapat menulis ke jobstates, jobdirsdan jobtextarray asosiatif; Saya tidak tahu berapa banyak yang dapat Anda capai dengan cara itu.)

Jika Anda ingin shell mengirim sinyal ke proses pembubaran seperti halnya untuk subproses miliknya, Anda dapat menulis pekerjaan rintisan yang menunggu sampai menerima sinyal dan mengirimkan sinyal yang sama ke proses pembubaran. Anda dapat mengirim SIGSTOPdan SIGCONTke proses yang ditolak untuk mensimulasikan Ctrl+ Zdan bg. Semua ini tidak akan semudah memiliki kembali.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Apa situasinya? Jika Anda hanya ingin mendapatkan kembali terminal Anda untuk sementara waktu, Anda bisa menggunakan Layar GNU saja. Itu tidak cukup melepaskan proses dari terminal - Layar mengemulasi satu untuk keuntungan proses - tetapi Anda dapat melampirkan dan melepaskannya dari terminal nyata yang Anda gunakan. Anda bahkan dapat melepaskan layar, keluar, lalu masuk kembali dan melampirkan kembali ke layar yang sama.

Scott
sumber
6
Keadaannya adalah: Anda menolak proses yang salah dan ingin mendapatkannya kembali.
nisc
1
Ah. Lebih keras. Layar perlu direncanakan.
Scott