שאלה שמירה על תהליך לינוקס פועל לאחר שאני מתנתק


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

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


139
2017-09-15 06:00






תשובות:


השיטה הטובה ביותר היא להתחיל את התהליך ב מרבב מסוף. לחלופין, אתה יכול להפוך את התהליך לא מקבל את האות HUP.


א מסוף מרבב מספק מסופים "וירטואליים" הפועלים עצמאית מהמסוף "האמיתי" (למעשה כל הטרמינלים כיום הם "וירטואליים", אבל זה נושא אחר ליום אחר). המסוף הווירטואלי ימשיך לפעול גם אם הטרמינל האמיתי שלך סגור עם הפעלת ssh.

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

שני multiplexers הטרמינל הפופולריים הם מסך ו tmux.

המסך יש עקומת למידה תלולה. הנה מדריך טוב עם דיאגרמות המסביר את הרעיון: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


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

שתי שיטות קלות לעשות זאת הן nohup ו disown.

לקבלת מידע נוסף על האופן שבו nohup ו disown עובד לקרוא את השאלה הזאת ואת התשובה: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

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


133
2017-09-15 06:05



אני אוהב את התשובה הזו משום שהיא מספקת פתרון למצבים אינטראקטיביים ולא אינטראקטיביים. במקרה האינטראקטיבי, screen נותן לך הרבה יותר אפשרויות, אבל אם אתה משתמש authorized_keys כדי לאפשר לאנשים להפעיל סקריפט מרחוק באמצעות ssh, ה nohup אפשרות היא דרך פשוטה פשוטה עבור סקריפט כדי להתחיל תהליכים אשר האחרון יותר מאשר ssh הפגישה המשמשת אותם להתחיל אותם. - Mark Booth
@rahmanisback - זכור כי אתה יכול לשנות את התשובה המקובלת שלך בכל עת. רק כי עד כה התשובה של אריקה הוא הצביע ביותר ביותר אין זה אומר שזה התשובה הטובה ביותר עבורך, אכן עושה את התשובה המקובלת שלך עשוי לעודד יותר אנשים להצביע את זה כתשובה טובה. - Mark Booth
* שיעול * tmuxisbetter * שיעול * - crasic
tmux > מסך. נסה את זה, אתה לעולם לא תחזור. - h0tw1r3
@TheLQ - byobu J מסך גנו. אתה עדיין משתמש במסך, רק עם מסך מותאם אישית. - EEAA


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

אחרי שאתה נכנס, לרוץ screen. זה יתחיל פגז נוסף פועל בתוך המסך. הפעל את הפקודה שלך, ואז לעשות Ctrl-א  ד.

פעולה זו תנתק אותך מהפעלת המסך. בשלב זה, תוכל להתנתק או לעשות כל דבר אחר שתרצה.

כאשר ברצונך להתחבר מחדש להפעלת המסך, פשוט הפעל screen -RD מן הפקודה פגז (כמשתמש להשתמש באותו שיצר את הפגישה).


92
2017-09-15 06:07



מדהים! תשובה מסודרת, תודה ... - rahmanisback
מסך יש חבורה שלמה של פקודה, כל מתחיל עם Ctrl-a. אם אתה רק ללמוד אחד נוסף, להתחיל עם "Ctrl-a?". אז אתה לא wan't ללמוד "Ctrl-C" ו "Ctrl-n" - olafure
@olafure +1, תודה. נראה כאילו המסך יהיה של ארגז הכלים הראשי שלי. - rahmanisback
tmux > מסך. נסה את זה, אתה לעולם לא תחזור. - h0tw1r3
+1 עבור tmux. ויתרתי על המסך לפני 5 שבועות. - Bryan Hunt


ב bash, ה disown מילת המפתח מתאימה באופן מושלם לכך. ראשית, להפעיל את התהליך ברקע (או להשתמש &, או ^Z ולאחר מכן הקלד bg)

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

על ידי הקלדה jobs אתה יכול לראות כי התהליך עדיין בבעלות הקליפה:

$ jobs
[1]+  Running  wget

אם היית להתנתק בשלב זה, המשימה ברקע היה גם נהרג. עם זאת, אם אתה מפעיל disown, bash מנתק את העבודה ומאפשר לה להמשיך לרוץ:

$ disown

תוכל לאשר זאת:

$ jobs
$ logout

אתה יכול גם לשלב את & ו disown באותו קו, כמו:

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

זה יותר טוב מאשר לרוץ nohup לדעתי משום שהיא אינה יוצאת nohup.out קבצים littered בכל רחבי מערכת הקבצים שלך. כמו כן, nohup יש להפעיל לפני הפעלת הפקודה - disown ניתן להשתמש רק אם אתה רק להחליט על כך שאתה רוצה רקע לנתק את המשימה.


70
2017-09-15 12:27



זו תשובה טובה מאוד, 1+. ההעדפה היחידה nohup או המסך יהיה עצמאות של bash, ויכול לשמש עם פגז אחר. אבל אני מקל על הגישה שלך בכל פעם שאני משתמש bash. - rahmanisback
כן - זה באש ספציפי, כמו באש הוא הקליפה היחידה שאני אי פעם בשימוש. אני תוהה אם פגזים אחרים תומכים בכל דבר דומה (כלומר, משגרים ברקע ללא נווהאפ) - זה יהיה פנטסטי אם מישהו יכול לכתוב תשובות אחרות לקליפות אחרות. - Jeremy Visser
לראות את התשובה שלי מראה איך לעשות את זה עם כל sh-lookalike - w00t
+1 בגלל היכולת להחליט מאוחר יותר. רק ברגע זה היה לי צורך בכך. עבד כפי שפורסם - code_monk


הכלי nohup, זמין על רוב תיבות לינוקס יעשה זאת.


37
2017-09-15 06:14



זוהי התשובה הפשוטה ביותר. כל פלט מופנה באופן אוטומטי ל- nohup.out וניתן לבחון אותו מאוחר יותר. - Julian
nohup אינו דורש zsh בכלל. - Aaron Brown
nohup היא התשובה הנכונה, היא קצרה עבור שום hangup. - Kinjal Dixit
nohup נמצא על מכונות הרבה יותר ואז המסך, אז אתה צריך לדעת איך להשתמש בו. - Zenon


רק כדי להיות יסודי, אני אציין tmux, שיש לו את אותו רעיון בסיסי כמו המסך:

tmux נועדה להיות חלופה מודרנית, BSD מורשה לתוכניות כגון מסך GNU. התכונות העיקריות כוללות:

  • ממשק חזק, עקבי, מתועד היטב ובקלות scriptable.
  • ניתן לפצל חלון אופקית ואנכית לחלוניות.
  • ניתן להזיז את הפאנלים באופן חופשי, לשנות את גודלם, או לסדר אותם לפריסות קבועות מראש.
  • תמיכה במסופי UTF-8 ו- 256 צבע.
  • העתק והדבק עם מאגרים מרובים.
  • תפריטים אינטראקטיביים לבחירת חלונות, פעילויות באתר או לקוחות.
  • שנה את החלון הנוכחי על-ידי חיפוש טקסט ביעד.
  • נעילת טרמינל, ידנית או לאחר פסק זמן.
  • מסד נתונים נקי, המורחב בקלות, BSD מורשה, תחת פיתוח פעיל.

עם זאת, קל יותר לחפש ב- Google.


27
2017-09-15 06:23



שימוש "gnu screen" כמו שאילתת החיפוש שלך עובד די טוב. - gnur
+1000 עבור tmux! - mbq


המסך הוא overkill עבור פשוט שמירה על תהליכים כאשר אתה מתנתק.

נסה dtachYou

dtach היא תוכנית שנכתבה ב C כי מחקה את התכונה של לנתק   מסך, המאפשר תוכנית להתבצע בסביבה כי   מוגן ממסוף הבקרה. למשל, התוכנית   תחת שליטה של ​​dtach לא יושפעו על ידי להיות מסוף   מנותקת מסיבה כלשהי.

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

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

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


11
2017-09-15 15:06



תודה. באתי לכאן רק כדי לכתוב על dtach מדי. עכשיו זה עניין שלי לניתוק סופי; המסך עושה הרבה יותר מדי, ומפריע קלט לתואר מגוחך. העובדה המסך צריך termcap משלו הוא די מטריד. - fluffy


הנה דרך daemonize כל תהליך פגז, אין תוכניות חיצוניות הדרושות:

( while sleep 5; do date; done ) <&- >output.txt &

כאשר אתה סוגר את הפגישה שלך, העבודה תמשיך לפעול כפי שמוכיח את הקובץ output.txt (אשר יש אגירה כך לוקח זמן להראות שאינם אפס). אל תשכח להרוג את העבודה שלך לאחר בדיקה.

אז כל מה שאתה צריך לעשות הוא לסגור stdin רקע העבודה. כדי להיות ממש טוב, קודם cd / אז אתה לא להחזיק על הר.

זה עובד אפילו בתוך sh תחת סולאריס.


9
2017-09-16 16:48



מעניין. זה התברר כמה שאלות בולטות. אני רואה שאתה קובע את STDIN לשום דבר, את - מפעיל? מה ההבדל בין < /dev/null ו &- ? אני מניח כי STDIN (ואחרים STDOUT ו STDERR) יכול להיות מוקצה או קובץ על ידי < file, או זרם על ידי <& stream במקרה של STDIN. האם זה יהיה אותו שימוש < /dev/null בדוגמה שלך למעלה? והאם המפעיל - לעיל מתייחסים אל ריק כמו זרם? - rahmanisback
כאשר אתה עושה x <& - - סוגר את מתאר הקובץ x. במקרה זה אין x, מה שהופך את ברירת המחדל bash ל 1, כלומר קלט רגיל. אם אתה משתמש </ dev / null אתה לא סגירת stdin, אתה פשוט נותן קובץ ריק לתוכנית כקלט. - w00t
וכדי להיות כנים אני לא ממש יודע למה זה daemonizes את הדבר שאתה מפעיל :-) זה עובד למרות, אנו משתמשים בו בייצור. גיליתי את זה תוך התעסקות בתקווה שאני יכול daemonize תהליך פגז ללא צורך שום דבר מיוחד - אז התחלתי על ידי סגירת stdin וזה היה מספיק. אני צריך ללכת לקרוא כמה מקורות פגז אבל אני מניח שאם אתה סוגר stdin ואת הרקע התהליך, זה גם לנתק את התהליך. - w00t
אני חושב שהסיבה לכך היא כי SIGHUP (האות בפועל שגורם לילד להפסיק כאשר פגז מת) מופעלת כאשר תהליך ההורה סוגר את הידית stdin של הילד. עם זאת, אם stdin מתחיל כמו ריק, במקום להיות סגורה לאחר מעשה, אין שום דרך להורה כדי להפעיל את SIGHUP. אבל נחמד למצוא - מעולם לא חשבתי על זה. - Jeremy Visser
@ JeremyVisser זה נשמע ממש מתקבל על הדעת! - w00t


ה at הפקודה יכול להיות שימושי עבור מצב זה של המצב. לדוגמה, הקלד:

at now

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

במקום now, אתה יכול לציין את הזמן אופציונלי עם תאריך, או ביטוי זמן כמו now + 15 minutes. ראה man at לפרטים נוספים.


7
2017-09-16 08:23





byobu על אובונטו הוא חזית חמוד למסך. על ידי לחיצה Ctrl-? אתה מקבל רשימה של כל קיצורי המקשים. זה מוסיף שורת מצב זה יכול להיות שימושי עבור צופה עומס CPU, שטח דיסק, וכו 'בסך הכל זה מספק חוויה שאני מתאר כחיבור VNC מסוף מבוסס.

nohup מאפשר הפעלת עבודה ברקע עם הפלט מנותב לקובץ יומן, אשר תמיד יכול להיות מנותב מחדש / dev / null אם לא נדרש.


7
2017-09-15 13:26