Askıya alınmış bir süreç öldürülsün mü?


17

Biraz kafam karıştı:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp

Bu yüzden sadece "kendim yap" istifa ettim ve daha sonra nedenini merak ettim:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

Ah!

Gerçekten mantıklı geliyor, şimdi bunu düşündüğümde, vimsinyal işleyicinin bırakması ve bunu yapması için bunun çalışması gerekiyor.

Ama açıkçası istediğim gibi değil.

Tek bir komutta "uyan ve çık" ın bir yolu var mı? yani, yerleşik bir takma ad kill %N && fg %N?

Arka planda devam etmek neden çalışmıyor? Bunun bgyerine fgVim fg, ben yukarıdaki kadar sezgilerimi kıran canlıya kadar hayatta kalır .

Yanıtlar:


20

vi-vi-vişeytandır. Ateşle öldürmelisin. Veya SIGKILL:

kill -KILL %1

Yerleşikler , askıya alınan işlemlere killgönderilecek SIGCONTkadar naziktir, böylece kendiniz yapmak zorunda kalmazsınız, ancak işlem gönderdiğiniz sinyali bloke ederse veya sinyali işlemek işlemlerin askıya alınmasına neden oluyorsa yardımcı olmaz. tekrar (eğer bir arka plan işlemi terminalden okumaya çalışırsa, varsayılan olarak, SIGTTINişlenmezse işlemi askıya alır) gönderilir ).


1
Neden dünyada SIGABRT kullanıyorsunuz? Bir program hatasını belirtmek içindir. SIGKILL tam burada, çünkü programı şimdi isteseniz de istemeseniz de öldürmek istiyorsunuz.
Gilles 'SO- kötü olmayı kes'

1
Aslında, SIGTERMen azından bunun için işleyicileri yoksa, şu anda uyanma uyku süreçlerine benziyor . Bunu ben zorunda hatırlıyorum çünkü bu şekilde çalışması için kullanılan vermedi düşünüyorum bgya fgda sinyal almak ve uzağa gider önce bir şey. Ama ile test ettim awk 'BEGIN{while(42){}}' &ve strace kill $!ve sadece bir kill(2)sistem çağrısı var SIGTERM.
Peter Cordes

6

vimsigprocmask(2)ortak sinyalleri yok saymak için sinyal işleyicileri kuruyor (ve muhtemelen de ayarlıyor ), böylece düzenlenmekte olan dosyalar bir kaçak kontrol + c veya rastgele öldürme sinyali nedeniyle kaybolmuyor. Daha basit bir program kolayca öldürülür:

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop

vimÇıkış yapmak (güvenli bir şekilde) , herhangi bir arabellek, vb. Kabul vimeden TERMveya bir USR1şeyleri kaydeden (veya atacak?) Bir sinyal işleyici gerektirir . Bu şekilde vimçıkış yapmak için ne yapmaya çalışıyorsunuz ?


"Vim çıkışını bu şekilde yapmak için ne yapmaya çalışıyorsun?" - hiçbir şey, gerçekten düzenlemekte olduğum bir "tmp" dosyasıydı. vimaskıya alınmayı test etmek için sadece kötü düşünülmüş bir program seçimiydi.
OJFord

1
"ortak sinyalleri yok sayın, böylece düzenlenmiş herhangi bir dosya başıboş bir kontrol + c veya rastgele öldürme sinyali nedeniyle kaybolmaz" - ancak fgbıraktığım anda sadece askıya alındığı sürece mi durdu?
OJFord

2
@OllieFord: Sadece SIGKILLuyku sürecini uyandırır, böylece ölebilir. Onları yok için özel işleyicileri olan bir asma sürece sinyal göndererek değil uyandırmak. ( SIGCONTTabii ki, devam sinyali, bgve fggönderin SIGCONT.)
Peter Cordes
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.