1 / 33

תרגול מס' 8

תרגול מס' 8 . קבצי script ניהול תהליכים ב- UNIX. לי-טל משיח litalma@cs.technion.ac.il. קבצי סקריפט. קבצי script הם קבצים אשר מכילים סדרה של פקודות shell תסריטים אלו מהווים מעין תוכניות הכתובות בשפת ה Shell תוכניות אלו נכתבות בקובץ רגיל ולאחר מכן מורצות

landis
Download Presentation

תרגול מס' 8

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. תרגול מס' 8 קבצי script ניהול תהליכים ב-UNIX לי-טל משיח litalma@cs.technion.ac.il

  2. קבצי סקריפט • קבצי script הם קבצים אשר מכילים סדרה של פקודות shell • תסריטים אלו מהווים מעין תוכניות הכתובות בשפת ה Shell • תוכניות אלו נכתבות בקובץ רגיל ולאחר מכן מורצות • ישנן מספר דרכים להריץ תסריטים. דרך אחת הנה באמצעות הפקודה source. >source clean תריץ את התסריט clean • במידה והקובץ clean (אשר הנו קובץ טקסט רגיל) הכיל את הפקודות הבאות: rm *.o mv ex1 ex1.old • אזי לאחר ביצוע הפקודה, ימחקו כל קבצי ה object ושם הקובץ ex1 ישונה ל ex1.old .

  3. C-shellשפת התסריטים של בכתיבת התסריטים נעזר בכל יכולות ה C-shell: • הגדרה ושמוש במשתנים • שמוש ב File name expansion • תוכניות שמושיות ב Unix – • יתרונו של התסריט ב-C-shell הנו יכולתו להריץ תוכניות שכבר נמצאות במערכת בקלות. בכל מערכת unix קיים סט של תוכניות שמושיות – utilities אשר ניתן לנצלן לצורך שילובן בתסריט • מבני בקרה ב C-shell • תסריטים אינם תחליף לתוכנית אלא משמשים בד"כ כ-"דבק חכם" בין תוכניות קיימות • גם בעת ביצוע תסריט מתבצעות כל ההחלפות בעת ניתוח שורת פקודה ע"פ אותו הסדר אשר הוצג בשיעור שעבר

  4. CShellמבני בקרה ב- • ב- CShell יש מבני בקרה הדומים לאלה אשר בשפת C • לולאות • משפטי תנאי • קפיצה בלתי מותנת

  5. CShell לולאות ב- repeat <count> <cshell command> משפטי repeat: • חוזר על הפקודה CShell command בדיוק count פעמים. <repeat 3 echo hello world hello world hello world hello world • כפי שרואים פקודה זו שמושית גם בצורת עבודה אינטראקטיבית.

  6. CShell לולאות ב- while (<expression>) <cshell commands> end • משפטי while: > source count10 0 1 2 3 4 5 6 7 8 9 # count10 script: @ i = 0 while ($i<10) echo $i @ i++ end

  7. CShell לולאות ב- foreach <variable> (<list of words>) <cshell commands> end :foreachמשפטי • המשתנה מקבל את כל אחד מהערכים ברשימה לפי סדר. לכל ערך אפשרי של המשתנה מתבצעת איטרציה של הלולאה • הרשימה יכולה להיות כתובה במפורש, או להתאים לתבנית בדומה לשמות של קבצים נניח כי במדריך מסוים קיימים הקבצים הבאים: amortize.c, helloworld.c, prog.c אזי, הפקודה: foreach F (*.c) echo $F end תדפיס: amortize.c helloworld.c prog.c • בלולאות foreach ו- while ניתן גם להשתמש בפקודות break ו- continue כמו ב- C.

  8. משפטי תנאי if (<expression>) <one cshell command> או if (<expression>) then <cshell commands> [else <cshell commands>] endif :ifמפשטי התנאים אותם ניתן לבחון במשפט ה if הינם: • תנאים חשבוניים: if ($a > 0) … • השוואת מחרוזות: if ($a == "kiko") … • תנאים יחודיים ל c-shell: if (-d $dir) then cd $dir ….. endif בודק אם המשתנה dir מכיל שם מדריך, ואם כן עובר אליו if (-f diary) lpr diary endif בודק אם קיים קובץ "פשוט" בשם diary, אם התשובה חיובית, מדפיס אותו

  9. משפטי תנאי - התאמה בין מחרוזות • פרט להשוואה רגילה בין שתי מחרוזות (המתבצעת ע"י האופרטור ==) ניתן לבדוק התאמה בין מחרוזות באופן חלקי באמצעות האופרטור ~= • בצד שמאל של האופרטור חייבת להופיע מחרוזת מלאה אך בצד ימין יכולה להופיע מחרוזת הכוללת סימנים מיוחדים כגון: $, ?, או ] [ שמשמעותם תוארה בשקפים קודמים • השלילה של האופרטור ~= היא ~! . > if (end_with_z =~ *[zZ]) echo match match > if ("no point in string" !~ *.*) echo "no point" no point > if ("no point - . - in string" !~ *.*) echo "no point" > האופרטורים (<, >, >= וכד') משווים בין מספרים. האופרטורים ==, =!, ~= ~! משווים בין מחרוזות. > if (0123 != 123) echo NOT NOT

  10. משפטי תנאי switch (<string>) case <string1>: <cshell commands> [breaksw] case <string2>: <cshell commands> [breaksw] . . . case <string_n>: <cshell commands> [breaksw] [default: <cshell commands>] endsw :switchמשפטי switch ($F) case "*.c": lpr $F breaksw case "*.o": rm $F breaksw endsw

  11. קפיצה בלתי מותנת goto <label> משפטי goto: - קופץ למקום המסומן ב- <label>: if (-f diary) then lpr diary else goto endprog endif if (-f diary2) then lpr diary2 endif endprog: אם קיים קובץ diary אז מדפיסים אותו וממשיכים, אחרת קופצים לסוף התוכנית. שמושי לטיפול בשגיאות, אך (כרגיל!) לא רצוי להשתמש ב goto באופן כללי.

  12. הרצת קבצי סקריפט ניתן להריץ את קבצי ה script בשתי דרכים: • להריץ את הקובץ בכל פעם ע"י source <file name> • הקובץ מורץ בתוך ה-shell הנוכחי, ולכן יש לו גישה למשתנים שהגדרנו ושינויים שהוא יבצע במשתנים "ייזכרו" • לקבוע את הקובץ כ executable פעם אחת, להריץ אותו ע"י <file name> > chmod +x myscript הופך את הקובץ myscript ל executable. כעת, הפקודה: > myscript תריץ את הקובץ myscript כקובץ script, בתוך shell חדש משל עצמו, כך ששינויים שיתבצעו למשתנים לא ייזכרו "מחוץ" להרצה

  13. הרצת קבצי סקריפט • כל קובץ script שרוצים להריץ בצורה זו חייב להתחיל עם השורה הבאה: #! /usr/local/bin/tcsh -f באיזה shell יש להשתמש לצורך הרצת התסריט אומר ל-shell לא לקרוא את קבצי האתחול שנקראים בדרך כלל במחשבים שונים כתובת קובץ ההפעלה יכולה להשתנות. ניתן למצוא מהי באמצעות הפקודה which, שבהינתן שם של קובץ הפעלה שנמצא באחד ה-PATH-ים שה-shell מכיר, מחזירה את הכתובת המלאה שלו.

  14. setupקבצי קבצי setup הם קבצי script מיוחדים אשר מורצים אוטומטית ע"י המערכת בזמנים מסוימים.קבצים אלו הם: • .login - מבוצע עם כניסת משתמש לחשבונו • .cshrc - מבוצע בהתחלת כל shell מכיון שקבצים אלה מופעלים בצורה אוטומטית בזמנים המצויינים, נהוג לאתחל בהם משתני סביבה חשובים, או להגדיר שמות חדשים לפקודות עם alias. דוגמא: < cat .cshrc set path = ($path ./) set history=40 alias ll 'ls -al' alias m 'more' alias . 'pwd' alias .. 'cd ..' alias ... 'cd ../..'

  15. פרמטרים לקבצי סקריפט • ניתן לתת פרמטרים לקבצי script. ניתן להתיחס לפרמטרים אלה בתוך קובץ ה- script כדלקמן: • $0 - הפקודה עצמה • $1 - הפרמטר הראשון (באופן כללי: ${n} מתייחס לפרמטר ה-n). • $* - רשימת כל הפרמטרים הנתונים לפקודה • {- ${#argv מציין את מספר הפרמטרים הנתונים לפקודה. • - ${argv[n]} מציין את הפרמטר מספר n. קובץ בשם print שתפקידו להדפיס את הקבצים שהוא מקבל כפרמטרים #! /usr/local/bin/tcsh -f foreach F ($*) lpr $F end דוגמת הרצה: > print a.c b.c prog.c

  16. קריאת שורות מקבצים • הפקודה $<)) קוראת שורה מה - standard input לתור רשימה. > set str2 = ($<) This line is typed by the user > echo $str2 This line is typed by the user > echo $str2[1] This > echo $str2[2] line • כאן נוצרה רשימה str2 אשר התוכן שלה הוא שורת הקלט מהstandard input - אין ב-cshell אפשרות לקרוא שורות קלט מקובץ!!! רק מה- standard input

  17. קריאת שורות מקבצים • כאשר רוצים לקרוא קובץ, כותבים את ה-script שמטפל בשורות הקובץ כאילו הוא מקבל קלט מה-standard input • לאחר מכן יוצרים קובץ script חדש - "מעטפת", שתפקידו להפעיל את ה-script המקורי, תוך שהוא מפנה אליו את הקובץ שאותו רוצים לקרוא • כלומר: באמצעות pipelining אנחנו גורמים לקובץ שאנחנו רוצים לקרוא להופיע בתור ה-standard input של הסקריפט

  18. דוגמא נתון קובץ football המכיל נתונים על שערים שהובקעו במשחקי כדורגל. כל שורה בקובץ מציינת שם של שחקן, מספר השערים שהבקיע במשחק שנערך בתאריך מסוים, שם הקבוצה בה הוא שיחק ושם הקבוצה היריבה. >cat football Alon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer Sheva Ronen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-Aviv Reuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-Aviv Eyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Haifa Alon Miz. 2 26/10/93 Macabi-Haifa Beitar-Jerusalem Izak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-Hiafa Alon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikva Ronen Har.3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa

  19. דוגמא ברצוננו לכתוב script בשם player, אשר יקבל כפרמטר שם מלא של שחקן וידפיס את כל השורות של הקובץ football בהן מופיע שם השחקן, ובנוסף ידפיס את סה"כ מספר השערים שהוא הבקיע. לדוגמא, הפלט עבור שורת הקלט Alon Miz. יהיה: > player “Alon Miz.” Alon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-Aviv Alon Miz. 2 26/10/93 Macabi-Haifa Beitar-Jerusalem Alon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikva total number of goals: 6

  20. פתרון ב - script בשם player לא נוכל לבצע קריאה שורה-שורה של הקובץ football ולכן נשתמש בו בתור מעטפת בלבד, ואת העבודה האמתית נבצע ב-script אחר בשם calc_total אשר יבצע את מבוקשנו על קלט מה-standard input. כעת, script המעטפת player יכול להשתמש ב-calc_total, על ידי הפנייה של הקובץ football ל-standard input שלו. נציג את שני התסריטים לביצוע המשימה:

  21. פתרון > cat player #!/usr/local/bin/tcsh -f grep "$1" football | calc-total > cat calc-total #!/usr/local/bin/tcsh -f set line = ($<) set sum = 0 while (${#line} != 0) @ sum = $sum + $line[3] echo $line set line = ($<) end echo "total number of goals: $sum"

  22. דוגמא מסכמת לפנינו script בשם scores המדרג את השחקנים אשר שמותיהם המלאים מועברים כפרמטר, לפי הנתונים המוכלים בקובץ football. הדירוג של כל שחקן ייקבע על פי מספר השערים שהוא הבקיע, כאשר שני שחקנים שהבקיעו מספר זהה של שערים יקבלו דירוג זהה. התוכנית מדפיסה עבור כל שחקן את דירוגו, את שמו המלא ואת מספר השערים שהבקיע. >cat football Alon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer Sheva Ronen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-Aviv Reuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-Aviv Eyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Haifa Alon Miz. 2 26/10/93 Macabi-Haifa Beitar-Jerusalem Izak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-Hiafa Alon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikva Ronen Har.3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa

  23. דוגמא מסכמת דוגמא להפעלת הסקריפט: > scores "Alon Miz." "Izak Zoh." "Ronen Ha." "Reuven A." 1 Alon Miz. 6 1 Ronen Ha. 6 2 Izak Zoh. 4 3 Reuven A. 2

  24. פתרון > cat scores #!/usr/local/bin/tcsh -f @ i = 1 while ( $i <= ${#argv} ) grep "${argv[$i]}" football | calc_score >>! temp @ i++ end sort -n +2 -r temp | calc_place if (-f temp) then rm -f temp endif יחזיר את שם השחקן וסה"כ מס' הגולים שהבקיע ימספר את השחקנים בהתאם לדירוגם

  25. פתרון > cat calc_score #!/usr/local/bin/tcsh -f set line = ($<) set sum = 0 set player_name = ($line[1-2]) while (${#line} != 0) @ sum = $sum + $line[3] set line = ($<) end echo "$player_name $sum" > cat calc_place #!/usr/local/bin/tcsh -f set line = ($<) set place = 1 @ goals = $line[3] while (${#line} != 0) if ($goals != $line[3]) then @ place++ @ goals = $line[3] endif echo "$place $line" set line = ($<) end

  26. UNIXבקרת תהליכים ב- • Unix היא מערכת הפעלה המסוגלת לשרת מספר רב של משתמשים בו זמנית, וכמו כן כל משתמש יכול להריץ בו זמנית מספר רב של תהליכים • תהליך יכול ליצור תהליכים נוספים, להרוג תהליך שיצר ולשלוח הודעות לתהליכים אחרים במערכת • בקורס זה לא נלמד כיצד תהליכים מבצעים את כל הפעולות הנ"ל (נשאיר זאת לקורס במערכות הפעלה), אלא נלמד כיצד משתמש יכול לייצר מספר תהליכים ולשלוט על אופן ביצועם

  27. יצירת תהליכים ב - Unix ישנן שתי צורות להריץ תוכניות: הרצה בחזית foreground • מתבצעת ע"י כתיבת הפקודה: <command> • פקודה המורצת בחזית גורמת ל-prompt להיעלם עד לסיום הפקודה ולכן לא נוכל להקליד פקודה נוספת כל עוד הפקודה הנוכחית לא הסתיימה • בחזית יכולה להתבצע פקודה אחת לכל היותר הרצה ברקע background • מתבצעת ע"י כתיבת הפקודה בתוספת &: <command> & >gcc Calc.c -o Calc הפקודה מורצת בחזית. >gcc Calc.c -o Calc & > הפקודה מורצת ברקע. • על מנת לבצע מספר תוכניות בו זמנית יש להריצן ברקע. לאחר תחילת ביצוע פקודה ברקע מופיע הפרומפט וניתן לתת למערכת פקודות נוספות שתתבצענה במקביל לפקודה שהורצה ברקע

  28. ניהול תהליכים בעזרת הפקודה jobs ניתן לבדוק אילו תהליכים קיימים ב-shell • סימן ה-"+" מייצג את התהליך ה"נוכחי" – התהליך שהוא ברירת המחדל לפקודות שנציג בהמשך • סימון ה-"-" מייצג את ה"יורש" – התהליך שיקבל את סימן ה-"+" אחרי שהתהליך הנוכחי יסיים את ריצתו < more forever.c main() { printf("I am going to run forever !!!\n"); while (1) ; } > forever & [1] 587 > I am going to run forever !!! > jobs [1] + Running forever > kill -9 %1 > [1] Killed forever >jobs [1] + Running cc prog.c [2] - Running troff -me big_doc.roff פקודות נוספות המאפשרות הצגה של התהליכים שקיימים כרגע הן: ps ו-top. ניתן למצוא את המידע בקבצי ה-man שלהן

  29. פקודות לניהול תהליכים • בכל הפקודות שנלמד בהמשך לניהול תהליכים יש מספר דרכים לציין תהליך מסוים: • %n - תהליך מספר n. • %s - התהליך אשר שורת פקודתו מתחילה במחרוזת s. • %?s - job אשר שורת פקודתו מכילה את המחרוזת s. • %% - התהליך הנוכחי (התהליך שסומן ב"+"). • %- - התהליך הבא (התהליך שסומן ב"-"). • לדוגמא כל המחרוזות הבאות מתייחסות לאותו תהליך מהדוגמא הקודמת: %1 %forever %for %?ever

  30. העברת תהליכים לחזית fg [jobIDs] • מעבירה את התהליך הנוכחי או [jobIDs] לחזית. > more try_input.c main() { char str[20]; printf("I shall try to eat something"); scanf("%s" , str); printf("%s" , str); } > try_input& [1] 828 > I shall try to eat something [1] + Suspended (tty input) try_input > jobs [1] + Suspended (tty input) try_input > fg %1 try_input goodies goodies >

  31. העברת תהליך לרקע bg [jobIDs] • מעבירה את התהליך הנוכחי או [jobIDs] לרקע > jobs [1] + Suspended forever > bg %1 [1] forever & > jobs [1] Running forever >

  32. השעיית תהליך • Ctrl-z - משעה את התהליך המתבצע כרגע בחזית. תהליך מושעה ניתן להעביר לחזית או לרקע ע"י שימוש בפקודות fg או bg. • הפקודהstopjobIDs משעה את jobIDs > nroff -ms report Ctrl-z [1] + Suspended nroff <bg % > emacs & [1] 982 > forever& [2] 991 > jobs [1] + Running emacs [2] - Running forever > stop %2 > [2] + Suspended (signal) forever > jobs [1] - Running emacs [2] + Suspended (signal) forever >

  33. הריגת תהליך • Ctrl-c - הורג את התהליך המתבצע כרגע בחזית • הפקודהkill-9jobID הורגת את התהליך jobID. • למרות שמה האכזרי, פקודת kill משמשת באופן כללי לשליחת הודעות. בפועל שתי ההודעות הנפוצות ביותר שאנו שולחים לתהליכים הן "תמות" (SIGTERM) ו"תמות תכף ומייד!" (SIGKILL). • הפרמטר לפקודת kill, בנוסף למזהה התהליך, הוא "-n", כאשר n הוא מספר מזהה של הודעה. אם לא מוסיפים מספר, ברירת המחדל היא שליחת ההודעה שמזוהה עם המספר 15 – "תמות". ההודעה שמזוהה עם המספר 9 היא "תמות תכף ומייד!". ההבדל בן שתי ההודעות היא ש"תמות" מאפשרת לתהליך להרוג את עצמו בצורה מסודרת (כמו ביצוע סגירה של המחשב על ידי לחיצה על הכפתור shut down במערכת ההפעלה) ואפילו להתעלם מההוראה, ואילו "תמות תכף ומייד!" הורגת את התהליך תכף ומייד (כמו ביצוע סגירה של המחשב על ידי ניתוק מהחשמל) < forever& [1] 660 > I am going to run forever !!! > kill -9 %fo > jobs >

More Related