Ssh कनेक्शन लॉस के बाद मेरी मृत्यु क्यों नहीं हुई?


13

मैंने sshअपने सर्वर को एड किया और भाग गया wget -r -np zzz.aaa/bbb/cccऔर यह काम करने लगा। तब मेरा इंटरनेट कनेक्शन (मेरे घर पर) बाधित हो गया और मैं यह सोचकर चिंतित हो गया कि यह पेड wgetहो गया है hupक्योंकि sshकनेक्शन खो गया था और इसलिए टर्मिनल की मृत्यु हो गई थी। लेकिन फिर मैंने sshअपने सर्वर को यह एहसास दिलाया कि यह अभी भी चल रहा है और आउटपुट को wget.logडाउनलोड करने और सामान डाउनलोड करने में लगा रहा है। क्या कोई मुझे समझा सकता है कि यहाँ क्या हुआ होगा?

यह वह है जो psमुझे देता है:

PID   %CPU %MEM    VSZ    RSS TTY     STAT START   TIME COMMAND
32283  0.6 29.4 179824 147088 ?       S    14:00   1:53 wget -r -np zzz.aaa/bbb/ccc

?के कॉलम में इसका क्या अर्थ है (प्रश्न चिह्न) tty?


ध्यान दें कि चल रहे एक आधुनिक सिस्टम पर logind, डिफ़ॉल्ट व्यवहार व्यवहार logindउपयोगकर्ता को लॉग आउट करने पर उपयोगकर्ता से संबंधित सभी प्रक्रियाओं (SIGTERM) को मारने के लिए होता है। तो यह व्यवहार प्रणाली-विशिष्ट है।
डैनियल प्रेडेन

@ मेरा सिस्टम ubuntu 16.04
yukashima huksay

2
मेरा मानना ​​है कि Ubuntu 16.04 एक systemd / logind सिस्टम है, लेकिन Ubuntu default logind.conf स्पष्ट रूप से सेट करता है KillUserProcesses=no
डेनियल प्रेडेन

जवाबों:


21

प्रोग्राम (और स्क्रिप्ट) कुछ को छोड़कर, अधिकांश संकेतों को अनदेखा करना चुन सकते हैं KILLHUPसंकेत पकड़ लिया और ध्यान नहीं दिया है, तो सॉफ्टवेयर इसलिए करना चाहता है किया जा सकता है।

इस से है src/main.cके wgetस्रोतों (संस्करण 1.19.2):

/* Hangup signal handler.  When wget receives SIGHUP or SIGUSR1, it
   will proceed operation as usual, trying to write into a log file.
   If that is impossible, the output will be turned off.  */

सिग्नल हैंडलर को थोड़ा और नीचे स्थापित किया गया है:

  /* Setup the signal handler to redirect output when hangup is
     received.  */
  if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
    signal(SIGHUP, redirect_output_signal);

तो ऐसा लगता wgetहै कि सिग्नल को अनदेखा नहीं किया जा रहा है HUP, लेकिन यह लॉग फ़ाइल में रीडायरेक्ट किए गए अपने आउटपुट के साथ प्रोसेसिंग जारी रखने का विकल्प चुनता है।


टिप्पणियों में अनुरोध: प्रश्न में आउटपुट ?के TTYकॉलम में अर्थ यह psहै कि यह wgetप्रक्रिया अब किसी टर्मिनल / TTY के साथ संबद्ध नहीं है। SSH कनेक्शन के डाउन होने पर TTY चला गया।


1
मुझे लगता है कि यह उपयोगी होगा यदि आप इसका अर्थ भी जोड़ते हैं? tty में।
युकाशिमा हक्साय

हाँ, यह कठिन तरीका सीखा। एसएचएस ड्रॉप होने पर सभी प्रक्रियाएं नहीं मरती हैं। यह जानना अच्छा है कि आखिर क्यों।
डग

2
वैकल्पिक रूप से, स्क्रीन का उपयोग करने की आदत बनाएं और कभी भी एचयूपी नहीं।
हार्पर - मोनिका

8

सरल : wgetगर्भपात नहीं करता है SIGHUP। यह SIGTERMऔर पर करता है SIGINT

manपृष्ठ पर कुछ भी नहीं है लेकिन अगर आपने SIGHUPएक wgetप्रक्रिया को भेजा है तो आपको यह टर्मिनल में मिलेगा:

# in a different terminal while wget is running (with PID 12345)
kill -HUP 12345
# in the wget terminal
SIGHUP received.
Redirecting output to 'wget-log'.

1
धन्यवाद। मुझे लगता है कि यह बेहतर है यदि आप यह kill -HUP pidदिखाने के लिए भी आदेश जोड़ते हैं कि SIGHUPकोई प्रक्रिया कैसे भेज सकता है।
युकाशिमा हक्साय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.