1.6 ג'ובים הרצאה
ג'ובים בbash¶
- במחשב יש לנו תהליכים, או באנגלית "process" (פרוססים), הן בעצם אוסף התוכנות שרצות במחשב שלנו.
קצת על תהליכים בלינוקס¶
בbash כאשר אנחנו מריצים פקודה מסויימת, אם היא פקודה חיצונית (לא מובנת)- כמו רוב הפקודות, הפקודה תרוץ כתוכנה נפרדת. כך שברמת התוכנות, חשבו שיהיה תוכנה אחת של bash, ותוכנה נוספת של הפקודה שאנחנו מריצים שהיא יוצאת מתוך התוכנה של bash.
- הריצו ps aux כדי לראות רשימה של כל התוכנות במערכת, אתם תראו בסוף הרשימה שקיימת התהליך של bash, שאותו אנחנו מריצים ומתחתיו התהליך של ps, של הפקודה החיצונית שbash הריץ.
- מכאן נובע שbash ממש יוצר תהליכים חדשים לכל הפקודות שאנחנו מריצים, כל עוד הם לא מובנות בbash- ואז הם היו רצות בתוך התהליך של bash.
ג'ובים¶
בbash אפשר להריץ מספר פקודות במקביל, הקונספט הזה נקרא ג'ובים (עבודות). כל פקודה שאנחנו מריצים בbash נקראת ג'וב (עבודה), כך שכל ג'וב שנוצר על ידי bash, בא לידי ביטוי כתהליך במערכת.
- לפני שנכנס עמוק לג'ובים, קודם נלמד על הפקודה sleep- הפקודה מאפשרת לנו להפסיק את הsession bash לכמה שניות שנגדיר. למשל הפקודה sleep 5 תעצור את הsession bash ל5 שניות.
- הריצו sleep 5 בטרמינל שלכם, ותראו מה קורה.
אותות¶
בלינוקס, יש המון דרכים שבהם תהליכים מתקשרים אחד עם השני, אחת מהדרכים הן- אותות - signal-ים.
- קיים מספר מוגדר של signal-ים שתהליכים יכולים לשלוח לתהליכים אחרים. הרשימה קיימת בman 7 signal(אפשר גם להריץkill -l).
חלק מsignal-ים- הם שגיאות שיכולות לקרות בתהליכים, חלקן מורות להתהליכים להפסיק את הריצה שלהם, ואפילו מבקשות מהתהליכים פשוט לקפוא (להפסיק את הריצה שלהם).
אותות בטרמינל¶
רשימת signal-ים נפוצים:
1. אות SIGINT, כל תהליכון בתהליך מסויים יכול לשלוח לתהליך, כדי לבקש יפה לסיים את הפרוסס (תהליכון הוא thread, כמו שלמדנו בקורס "תכנות בסיסי")
2. אות SIGTERM, כל תהליך במערכת יכול לבקש יפה מהתהליכים אחרים לסיים את עצמם
3. אות SIGKILL, אות שמורה על תהליך אחר להרוג את עצמו במיידית.
4. אות SIGSTP, אות שמבקש מהתליך אחר לשהות אותו- כלומר להיות בפרייז.
אותות בbash:
- בbash אם נלחץ ctrl+c בזמן הרצת פקודה, ישלח אות SIGINT לתהליך לסיים את עצמו- נסו להריץ sleep 5 ולחצו על ctrl +c וראו מה קורה.
- בbash אם נלחץ ctrl+z בזמן הרצת פקודה, ישלח אות SIGSTP, שתשהה את התהליך הנוכחי אבל לא תעצור אותו. (כלומר תכניס אותו לפריז)
שליחת signal-ים לתהליכים:
- הפקודה kill מאפשרת לשלוח כל signal שנבחר בצורה נוחה דרך הטרמינל לכל תהליך שנרצה.
- כדי להריץ את הפקודה נצטרך שני דברים: התהליך שלו נרצה לשלוח את הsignal וסוג הsignal.
1. נציין את התהליך לפי הid שלו, (המזהה שלו)- עם הפקודה ps aux נוכל לראות את כל התהליכים והpid שלהם - "process id".
2. אחרכך נבחר סוג signal שנרצה לשלוח לפי הרשימה ב"kill -l".
- לדוגמה הפקודה <kill -9 <PID תשלח SIGKILL לPID שנבחר, והפקודה <kill -15 <PID תשלח SIGTERM לPID שנבחר.
שימוש בג'ובים בטרמינל¶
אז בbash כשאנחנו מריצים ג'וב חדש, (פקודה חדשה)- הטרמינל שלנו יחסם עד שהפקודה תסיים לרוץ.
- כדי להריץ פקודה בbash שלא חוסמת את הshell, ניתן להריץ אותה עם & בסוף הפקודה. למשל אם נריץ & sleep 60, הפקודה תרוץ מאחורי הקלעים ולא תחסום לנו את הshell. ניתן להריץ ps aux כדי לראות שהפרוסס עדיין רץ.
- הפקודה jobs תראה לנו את כל הג'ובים שכרגע רצים. אנחנו נראה ג'וב אחד של sleep 60 שרץ ברקע, ונראה גם כנראה ג'וב נוסף שעשינו לו מקודם ctrl+z (אם עשיתם לפקודה כלשהי פרייז.)
- בנוסף ליד כל job יוצג מספר כלשהו שמזהה אותו.
- הפקודה bg מחזירה ג'וב מושהה (כמו האחד שעשינו לו ctrl+z) שירוץ ברקע, נביא לפקודה כפרמטר את הג'וב אותו נרצה להחזיר לרוץ- לפי המספר שלו שמוצג בפקודה jobs.
- למשל אם נריץ: sleep 42, נלחץ ctrl+z, ואז נריץ jobs, נראה שsleep 42 יהיה הjob הראשון ברשימה- אז מספרו יהיה 1. אז אם נריץ bg %1 הוא יחזור לרוץ ברקע. לרוב נשתמש ב ctrl+z בשילוב עם bg %1 כדי להעביר דברים שהרצנו לרקע.
אני מזכיר שאפשר להריץ פקודות מלתחתילה ברקע עם לשים בסוף הפקודה &.
- הפקודה fg משמשת אותנו כדי להחזיר אותנו בטרמינל לפקודה מסויימת, כלומר אם הרצנו מספר job-ים ברקע, נוכל לחזור אליהם עם הרצת הפקודה fg %job_number כאשר job_number הוא המספר של הjob אילו נרצה לחזור.
שילוב של ctrl+c, ctrl+z, jobs, kill, bg, fg, & יאפשר לכם לנהל את הjob-ים שלכם בטרמינל בצורה נוחה ביותר.