שאלה האם מקבל מנותק מ SSH הפעלה להרוג את התוכניות שלך?


אז, נגיד אני מקבל מנותק מ SSH- הפגישה לאחר שהתחלתי rsync או cp או כל פקודה אחרת שיכולה לפעול לאורך זמן. האם פקודה זו ממשיכה לפעול עד שהיא מסתיימת אחרי שאני מתנתק או שזה פשוט נהרג?

תהיתי את זה תמיד.


76
2018-01-06 03:09




אני רק רוצה להוסיף את מה שנאמר לעיל, אם אתה מוצא את עצמך במצב שבו אתה צריך לשים כבר פועל תהליך לתוך screen, נסה רפטיר. - a sad dude


תשובות:


ערוך עבור 2016:

זה Q & A מראש v230 הכישלון - -. החל של systemd v230, ברירת המחדל החדשה היא להרוג את כל הילדים של הפגישה התחברות לסיום, ללא קשר מה אמצעי זהירות תקף מבחינה היסטורית נלקחו כדי למנוע זאת. ניתן לשנות את ההתנהגות על ידי הגדרה KillUserProcesses=no in /etc/systemd/logind.conf, או לעקוף באמצעות מנגנוני ספציפי systemd עבור הפעלת daemon ב- userspace. מנגנונים אלה הם מחוץ לתחום של שאלה זו.

הטקסט שלהלן מתאר כיצד דברים עבדו באופן מסורתי ב- UNIX designspace במשך זמן רב יותר מאשר לינוקס קיימת.


הם ייהרגו, אבל לא בהכרח מיד. זה תלוי כמה זמן לוקח הדמון SSH להחליט כי החיבור שלך מת. להלן הסבר ארוך יותר שיעזור לך להבין איך זה באמת עובד.

כאשר אתה מחובר, הדמון SSH הקצה מסוף פסאודו בשבילך והצמיד אותו פגז הכניסה של המשתמש שלך מוגדר. זה נקרא מסוף השליטה. כל תוכנית אתה מתחיל בדרך כלל בשלב זה, לא משנה כמה שכבות של פגזים עמוק, בסופו של דבר לעקוב אחר מוצאה בחזרה לקליפה. אתה יכול לראות את זה עם pstree פקודה.

כאשר תהליך daemon SSH המשויך החיבור שלך מחליט כי החיבור שלך מת, הוא שולח אות hangup (SIGHUP) לקליפת ההתחברות. זה מודיע את הקליפה כי אתה נעלם וזה צריך להתחיל לנקות אחרי עצמו. מה שקורה בשלב זה הוא ספציפי מעטפת (חיפוש בדף התיעוד שלה עבור "HUP"), אבל על פי רוב זה יתחיל לשלוח SIGHUP להפעלת עבודות הקשורות אליו לפני סיום. כל אחד מאותם תהליכים, בתורו, יעשה כל מה שהם מוגדרים לעשות עם קבלת האות. בדרך כלל זה אומר סיום. אם עבודות אלה יש עבודות משלהם, את האות לעתים קרובות לקבל עבר גם כן.

התהליכים השורדים במעבר של הטרמינל השולט הם אלה אשר ניתקו את עצמם ממסוף (תהליכי daemon שהתחלתם בתוכו), או כאלה שהופעלו עם קידומת nohup פקודה. (כלומר, "אל תנתק על זה") Daemons לפרש את האות HUP אחרת; כיוון שאין להם מסוף בקרה ואינם מקבלים אות HUP באופן אוטומטי, הוא מתבצע מחדש כבקשה ידנית של מנהל המערכת כדי לטעון מחדש את התצורה. באופן אירוני זה אומר שרוב המנהלים לא ללמוד את השימוש "hangup" של האות הזה עבור לא דמונים עד הרבה, הרבה יותר מאוחר. ללא שם: לכן אתה קורא את זה!

טרמינלי מרבב הם דרך נפוצה לשמור על סביבת פגז שלך שלם בין ניתוקים. הם מאפשרים לך לנתק את תהליכי פגז שלך בצורה שאתה יכול להתחבר אליהם מאוחר יותר, ללא קשר אם זה ניתוק היה מקרי או מכוון. tmuxו screen הם אלה פופולריים יותר; תחביר לשימוש בהם הוא מעבר להיקף של השאלה שלך, אבל הם שווים להסתכל לתוך.


התבקשתי לפרט כמה זמן לוקח הדמון של SSH להחליט שהחיבור שלך מת. זוהי התנהגות ספציפית לכל יישום של daemon SSH, אבל אתה יכול לסמוך על כולם לסיים כאשר משני הצדדים מאפס את חיבור TCP. זה יקרה מהר אם השרת מנסה לכתוב את השקע ואת מנות TCP אינם מוכרים, או לאט אם שום דבר לא מנסה לכתוב PTY.

בהקשר הספציפי הזה, הגורמים העלולים ביותר לגרום לכתב הם:

  • תהליך (בדרך כלל זה שבחזית) מנסה לכתוב ל- PTY בצד השרת. (שרת-> לקוח)
  • המשתמש מנסה לכתוב ל- PTY בצד הלקוח. (לקוח-> שרת)
  • ללא שם: החזירים מכל סוג שהוא. אלה בדרך כלל אינם מופעלים כברירת מחדל, על ידי הלקוח או השרת, ויש בדרך כלל שתי טעמים: רמת היישום ו- TCP מבוסס (כלומר SO_KEEPALIVE). Keepalives כמות לשרת או הלקוח לעתים רחוקות שולח מנות לצד השני, גם כאשר שום דבר אחרת היה סיבה לכתוב לשקע. אמנם זה מיועד בדרך כלל כדי חומת אש כי הזמן את החיבורים מהר מדי, יש לו את תופעת לוואי נוספת של גורם השולח להבחין כאשר הצד השני אינו מגיב כי הרבה יותר מהר.

הכללים הרגילים עבור הפעלות TCP חלים כאן: אם יש הפרעה בקישוריות בין הלקוח לשרת, אך אף צד לא מנסה לשלוח מנות במהלך הבעיה, החיבור ישרוד בתנאי ששני הצדדים מגיבים לאחר מכן ומקבלים את ה- TCP הצפוי מספרים ברצף.

אם אחד הצדדים החליט כי השקע מת, ההשפעות הן בדרך כלל מיידיות: תהליך sshd ישלח HUP ואת עצמי לסיים (כפי שתואר קודם לכן), או הלקוח יודיע למשתמש של הבעיה זוהה. ראוי לציין כי רק בגלל צד אחד חושב השני מת לא אומר כי השני כבר קיבל הודעה על כך. הצד היתום של החיבור יישאר פתוח עד שינסה לכתוב אליו ולשלוח אותו, או יקבל איפוס TCP מהצד השני. (אם הקישוריות הייתה זמינה באותה עת) הניקוי המתואר בתשובה זו קורה רק פעם אחת שרת שם לב.


109
2018-01-06 04:36



הייתי גם להוסיף את הפקודה 'dtach' לרשימה - זה סוג של ההפך של המסך / tmux בכך שהוא מאפשר לך לצרף מסופים מרובים לפגישה אחת, והוא גם נהדר להאריך את הפגישה, אם כי זה לא לספק כל אמצעי החזרה על ההיסטוריה האחרונה. - fluffy
dtach url נמצא כאן: dtach.sourceforge.net - slm
הסבר מצוין. ללא שם: אני מרגיש יותר linuxey כבר! - fregas
כמו כן, למרות שזה לא חלק טכנית התשובה שלך, הנה קצת טריוויה מעניין: אתה יכול להשתמש kill -HUP כמו שורש לכפות הטרמינל של מישהו לנתק. אתה לא צריך לעשות את זה בלי סיבה טובה. אני מקבל את רוב קילומטראז שלי מתוך זה כאשר משתמשים להשאיר פגזים פועל במהלך תחזוקה ואני צריך unmount מערכת הקבצים כי פגז שלהם שומר פתוח. אם המשתמש מחובר אך לא פעיל סופית, לשלוח את האות לתהליך sshd שלהם. אחרת, אם הוא פועל בתוך מרבב מסוף, שלח אותו לקליפה שברצונך לעצור. רק לתלות את הקונכייה שומר ממך לעבוד! - Andrew B
@ AndrewB, אתה יכול בבקשה לפרט על איך "תהליך daemon SSH ... מחליט כי החיבור שלך מת"? ואיך אני יכול לדעת אם הדמון של SSH חושב / יודע שהחיבור (איזה) מת או לא? - Xiao Peng - ZenUML.com


כמו אחרים של הזכיר, ברגע שאתה להתנתק ssh משהו פועל בתוך זה נעלם.

כפי ש מייקל המפטון ואחרים ציינו שאתה יכול להשתמש בכלים כמו tmux או screen לנתק / להתחבר מחדש למסופים מבלי לאבד את התוכן שלהם (כלומר, תהליכי הילד).

בנוסף אתה יכול לשים תהליך לתוך הרקע באמצעות אמפרסנד & ולאחר מכן השתמש בפקודה disown כדי לנתק אותם עם הקליפה הנוכחית.

# start a command
% sleep 5000 &
[1] 3820

# check it
% jobs
[1]+  Running                 sleep 5000 &

# disown everything
% disown -a

# check it again (gone from shell)
% jobs
%

# but it's still running on the system
% ps -eaf|grep "[s]leep"
saml      3820 23791  0 00:16 pts/1    00:00:00 sleep 5000
%

21
2018-01-06 05:27



האם ניתן לחבר מחדש את הפגישה הסופית ל disownתהליך ed? - Fake Name
כן. עיין בשאלה זו בנושא U & L לקבלת פרטים: unix.stackexchange.com/questions/4034/... - slm


לא, כל התוכניות עדיין מחוברת למסוף, ולא להציב לתוך הרקע עם משהו כמו nohup, ייהרג.

זו הסיבה שיש פתרונות מסוף וירטואלי כמו tmux ואת המבוגר screen אשר ליצור הפעלות אשר ממשיכים לפעול גם אם אתה מנותק, ואשר אליו אתה יכול reattach מאוחר יותר.


11
2018-01-06 03:16