एक निलंबित प्रक्रिया को मार डालो?


17

मैं थोड़ा उलझन में था:

% 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

इसलिए मैंने इस्तीफा दे दिया "बस इसे खुद करो" और आश्चर्य है कि बाद में क्यों:

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

ओह!

वास्तव में समझ में आता है, अब जब मैं इसके बारे में सोचता हूं, तो vimइसे सिग्नल हैंडलर को छोड़ने के लिए, और ऐसा करने के लिए चलना होगा।

लेकिन जाहिर है कि मेरा इरादा नहीं था।

क्या एक आदेश में "जागना और छोड़ना" है? यानी, एक अंतर्निहित उपनाम के लिए kill %N && fg %N?

पृष्ठभूमि में फिर से शुरू करने से काम क्यों नहीं चलता है? यदि मैं bgइसके बजाय fg, विम जब तक जीवित रहता हूं fg, जो मेरे उपरोक्त अंतर्ज्ञान को तोड़ता है।

जवाबों:


20

vi-vi-viशैतान का है। आपको इसे आग से मारना चाहिए। या SIGKILL:

kill -KILL %1

अंतर्निहित प्रक्रियाओं killको भेजने के SIGCONTलिए बिल्टइन पर्याप्त हैं ताकि आपको इसे स्वयं न करना पड़े, लेकिन यह मदद नहीं करेगा यदि प्रक्रिया आपके द्वारा भेजे जाने वाले सिग्नल को ब्लॉक करती है या यदि सिग्नल को संभालने से प्रक्रियाएं निलंबित हो जाती हैं। फिर से (यदि कोई पृष्ठभूमि प्रक्रिया टर्मिनल से पढ़ने की कोशिश करती है, तो डिफ़ॉल्ट रूप से, यह भेजा जाएगा SIGTTIN, जो प्रक्रिया को अनहेल्दी कर देता है)।


1
पृथ्वी पर आप SIGABRT का उपयोग क्यों करेंगे? यह एक प्रोग्राम बग इंगित करने के लिए है। SIGKILL यहीं है क्योंकि आप प्रोग्राम को मारना चाहते हैं, चाहे वह इसे चाहे या न चाहे।
गिल्स एसओ- बुराई को रोकना '

1
वास्तव में, यह SIGTERMअब जागने वाली प्रक्रियाओं की तरह दिखता है , कम से कम अगर उनके पास इसके लिए हैंडलर नहीं हैं। मैं इसे इस तरह से काम करने के लिए, के बाद से मैं करने के लिए याद इस्तेमाल किया नहीं था लगता है bgया fgकुछ पहले यह संकेत प्राप्त और दूर जाना होगा। लेकिन मैं के साथ परीक्षण किया awk 'BEGIN{while(42){}}' &, और strace kill $!, और केवल एक kill(2)सिस्टम कॉल के साथ है SIGTERM
पीटर कॉर्डेस

6

vimsigprocmask(2)सामान्य सिग्नलों को अनदेखा करने के लिए सिग्नल हैंडलर (और शायद सेटिंग भी ) स्थापित कर रहा है ताकि संपादित की जा रही कोई भी फाइल आवारा नियंत्रण + सी या रैंडम किल सिग्नल के कारण खो न जाए। एक सरल कार्यक्रम आसानी से मारा जाता है:

% 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के लिए बाहर निकलें (सुरक्षित रूप से) एक संकेत हैंडलर की आवश्यकता होगी में vimहै कि स्वीकार TERMया USR1या कुछ और, बचाता है (छोड देता है या?) किसी भी प्रतिरोधक, आदि तुम क्या जरूरत के लिए क्या करने के लिए बनाने की कोशिश कर रहे हैं vimइस तरह से बाहर निकलें?


"आप इस तरह से बाहर निकलने के लिए क्या करने की कोशिश कर रहे हैं?" - कुछ नहीं, यह वास्तव में "tmp" फाइल थी जिसे मैं संपादित कर रहा था। vimनिलंबन का परीक्षण करने के लिए कार्यक्रम का सिर्फ एक गलत अनुमान था।
OJFord

1
"सामान्य संकेतों को अनदेखा करें ताकि किसी भी फाइल को संपादित किया जा रहा है एक आवारा नियंत्रण + सी या रैंडम किल सिग्नल के कारण खो नहीं जाता है" - लेकिन जैसे ही मैंने fgछोड़ दिया, यह केवल तब तक के लिए बंद हो गया जब तक इसे निलंबित कर दिया गया?
OJFord

2
@ ऑलीफोर्ड: केवल SIGKILLएक नींद की प्रक्रिया को जागता है ताकि यह मर सके। एक निलंबित प्रक्रिया के लिए सिग्नल भेजना जो उनके लिए कस्टम हैंडलर हैं, इसे नहीं जगाते। (अन्य SIGCONT, जारी संकेत, निश्चित रूप से। bgऔर fgभेजें SIGCONT।)
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.