Bash / ZSH: 'Uzaklaşmayı' geri almak


30

“Görevden alındıktan” sonra, mermi işi masasına bir işlemi “yeniden bağlamak” için bir yol var mı?

Düzenleme: $ SEARCHENGINE beni tamamen başarısız ediyor. Çok iyi görünmüyor

Yanıtlar:


16

Linux işlerinin ve süreç sahipliğinin nasıl çalıştığını göz önünde bulundurarak, kabul ediyorum, benimseyen sürecin yardımı olmadan, bir sürece yeniden sahip olmak gerçekten mümkün değil.

Bir ebeveyn bir çocuğu 'reddedebilir', o zaman 'init' olarak adlandırılan süreç tarafından “evlat edinilir”. Sistem güvenliği, birinin başka birinin işlemlerini ele geçirmesini önler. Bunu reddettiğinizde, bir süreç kontrol etmek için başkasının (init) olur. Siz 'kullanıcı' olarak işlemi hala öldürebilirsiniz, ancak geri alamazsınız. Init'i işleminize geri döndürmeye zorlama girişimi, init'in bile posta okumaması gibi işe yaraması mümkün değildir.

Kulağa geldiği gibi, "Yapma!" Cevabını gerçekten kaybediyor.


1
Bu doğru olamaz: ana süreç, çocuğun çıkmak dışında evlat edinilmesine neden olamaz. Tanımladığınız davranış, çocuk sürecinden (veya ebeveyn ölürse bunu otomatik olarak yapan çekirdek) tarafından tetiklenmelidir. Bir süreç gönüllü olarak bir çocuğu evlat edemez, fakat birinden de vazgeçemez.
Gilles 'SO- kötülükten vazgeçmeyi'

1
Özür dilerim. Benim hatam. Çok fazla basitleştirildi. Yine bash kaynağından geçti, bash hâlâ sahipliğini koruyor, ancak çocuk sürecine geçmesini engelliyor. Bu yüzden geri almak mümkün olabilir, ancak henüz bash'a yerleşik değil. Bazı nedenlerden dolayı, init'in yetim ve zombilere yakalanmasına sıkışıp kaldım.
lornix

@lomix evet, ama kabuğu terk ettiğinizde ondan vazgeçtiniz, o zaman 1'den fazla ücret alıyorsunuz, bu yüzden mantığınız geçerli. kimseyle çıkmak istemediği sürece istifa edenler: p
Orwellophile

1
Üzgünüz, ama bu cevap yanlış. Sadece kullanın reptyr(kullanım örneği için cevabımı inceleyin).
Christian Pietsch

18

Bunun, talihsiz durumdaki hiç kimsenin yanlış işlemi reddetmiş olmasına yardım etmeyeceğini varsaysam da, eğer iş akışınızdan vazgeçmek ve yerine geçmek için:

https://github.com/nelhage/reptyr

Herhangi bir işlemi geri alabileceksiniz (yani, ekran içinde hareket ettirebilirsiniz).


2
Eh, reddedilmiş vim sürecimi reptyr ile geri aldım, bu yüzden tam da aradığım unyown yardımcı programı gibi çalıştı.
hlovdal

Haklısın, @hlovdal: Bu cevap yarı yanlıştır. reptyrçözümdür, ancak kullanmayı bırakmanıza gerek yoktur disown. Netlik için yeni bir cevap yazdım.
Christian Pietsch

11

İhtiyacın olan tek şey reptyr. GitHub'da yaşıyor ve Wheezy'den beri Debian ve muhtemelen diğer GNU / Linux dağıtımları için paketlendi. İşlem kimliği (PID) ile çağırırsanız, sahipsiz sürecinizi mevcut terminalde ön plana çıkarır. Yani örneğin:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here

2
(sudo apt-get install reptyr) Ardından ilk denemede bunu yaptım: "Ekleme işlemi sırasında çekirdek izin vermedi. Uid'iniz hedefle eşleşiyorsa, / proc / sys / kernel / yama / ptrace_scope değerini kontrol edin. Daha fazla bilgi için, bkz. /etc/sysctl.d/10-ptrace.conf "Her iki konumdaki değeri 1'den 0'a değiştirdim ve işe yaradı. Aynı kullanıcı olarak bir sürecin reddetmesini ve reptyr testini yaptım (ubuntu 14.04 LTS üzerindeki ipython notebook). Belki de bu, yalıtılmış bir ortamda gelişme için tamamdır ... ancak değişimin nihai güvenlik çarpışmalarından emin değilsiniz. Belki de uzmanlığı olan biri
içeri girebilir

1

Üzgünüm hayır. Prensip olarak bu mümkün değildir, çünkü ortadan kaldırmak sadece bazı kabuk içsel durumlarını değiştirir - temel olarak işlem kimliğini bir listeden kaldırır ve çok fazla güçlük çekmeden geri konabilir (bu testlerde biraz dikkatli olmanız gerekir) Yeniden yerleştirilen pid doğru oturumda, ancak bu aşılmaz bir şey değil). Ancak normal mermilerden hiçbirinin (bash, ksh, tcsh, zsh) yeniden eklemenin bir yolu yok gibi görünüyor. (Her ne kadar zsh ile ve ortak dizelere yazabilseniz de jobstates, bu şekilde ne kadar başarabileceğinizi bilmiyorum.)jobdirsjobtext

Kabuğun sahipsiz alt işlemlerinde olduğu gibi istenmeyen işlemlere sinyal göndermesini istiyorsanız, bir sinyal alana ve aynı sinyali gönderilmeyen işleme gönderene kadar bekleyen bir saplama işi yazabilirsiniz. + Ve işaretlerini taklit etmek için istenmeyen işlemlere gönderebilir SIGSTOPve gönderebilirsiniz . Bunların hiçbiri yeniden sahiplenmek kadar uygun değildir.SIGCONTCtrlZbg


0

Koşullar nelerdir Eğer terminalinizi bir süre daha geri almak istiyorsanız, bunun yerine GNU Ekranını kullanabilirsiniz . Süreci bir uçbirimden tamamen ayırmaz - Ekran, işlemin faydası için öykünür - ancak kullandığınız asıl uçbirimden takıp çıkarabilirsiniz. Hatta bir ekranı çıkarabilir, çıkış yapabilir, sonra tekrar giriş yapabilir ve aynı ekrana tekrar ekleyebilirsiniz.


6
Koşullar: Yanlış işlemi reddedersiniz ve geri almak istersiniz.
nisc

1
Ah. Daha güçlü. Ekranın önceden planlanması gerekiyor.
Scott,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.