לדלג לתוכן

1.6 - ג'ובים - הרצאה

ג'ובים בbash

  • במחשב יש לנו processes, או באנגלית "process" (פרוססים), הן בעצם אוסף התוכנות שרצות במחשב שלנו.

קצת על processes בלינוקס

בbash כאשר אנחנו מריצים פקודה מסויימת, אם היא פקודה חיצונית (לא מובנת)- כמו רוב הפקודות, הפקודה תרוץ כתוכנה נפרדת. כך שברמת התוכנות, חשבו שיהיה תוכנה אחת של bash, ותוכנה נוספת של הפקודה שאנחנו מריצים שהיא יוצאת מתוך התוכנה של bash.
- הריצו ps aux כדי לראות רשימה של כל התוכנות במערכת, אתם תראו בסוף הרשימה שקיימת הprocess של bash, שאותו אנחנו מריצים ומתחתיו הprocess של ps, של הפקודה החיצונית שbash הריץ.
- מכאן נובע שbash ממש יוצר processes חדשים לכל הפקודות שאנחנו מריצים, כל עוד הם לא מובנות בbash- ואז הם היו רצות בתוך הprocess של bash.

ג'ובים

בbash אפשר להריץ מספר פקודות במקביל, הקונספט הזה נקרא ג'ובים (עבודות). כל פקודה שאנחנו מריצים בbash נקראת ג'וב (עבודה), כך שכל ג'וב שנוצר על ידי bash, בא לידי ביטוי כprocess במערכת.
- לפני שנכנס עמוק לג'ובים, קודם נלמד על הפקודה sleep- הפקודה מאפשרת לנו להפסיק את הsession bash לכמה שניות שנגדיר. למשל הפקודה sleep 5 תעצור את הsession bash ל5 שניות.
- הריצו sleep 5 בטרמינל שלכם, ותראו מה קורה.

אותות

בלינוקס, יש המון דרכים שבהם processes מתקשרים אחד עם השני, אחת מהדרכים הן- אותות - signal-ים.
- קיים מספר מוגדר של signal-ים שprocesses יכולים לשלוח לprocesses אחרים. הרשימה קיימת בman 7 signal(אפשר גם להריץkill -l).
חלק מsignal-ים- הם שגיאות שיכולות לקרות בprocesses, חלקן מורות להprocesses להפסיק את הריצה שלהם, ואפילו מבקשות מהprocesses פשוט לקפוא (להפסיק את הריצה שלהם).

אותות בטרמינל

רשימת signal-ים נפוצים:
1. אות SIGINT, כל תהליכון בprocess מסויים יכול לשלוח לprocess, כדי לבקש יפה לסיים את הפרוסס (תהליכון הוא thread, כמו שלמדנו בקורס "תכנות בסיסי")
2. אות SIGTERM, כל process במערכת יכול לבקש יפה מהprocesses אחרים לסיים את עצמם
3. אות SIGKILL, אות שמורה על process אחר להרוג את עצמו במיידית.
4. אות SIGSTP, אות שמבקש מהprocess אחר לשהות אותו- כלומר להיות בפרייז.
אותות בbash:
- בbash אם נלחץ ctrl+c בזמן הרצת פקודה, ישלח אות SIGINT לprocess לסיים את עצמו- נסו להריץ sleep 5 ולחצו על ctrl +c וראו מה קורה.
- בbash אם נלחץ ctrl+z בזמן הרצת פקודה, ישלח אות SIGSTP, שתשהה את הprocess הנוכחי אבל לא תעצור אותו. (כלומר תכניס אותו לפריז)
שליחת signal-ים לprocesses:
- הפקודה kill מאפשרת לשלוח כל signal שנבחר בצורה נוחה דרך הטרמינל לכל process שנרצה.
- כדי להריץ את הפקודה נצטרך שני דברים: הprocess שלו נרצה לשלוח את הsignal וסוג הsignal.
1. נציין את הprocess לפי הid שלו, (המזהה שלו)- עם הפקודה ps aux נוכל לראות את כל הprocesses וה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-ים שלכם בטרמינל בצורה נוחה ביותר.