33
ססססס סס' ססססס סס'8 8 סססס ססססscript script - ססססס ססססססס ס- ססססס ססססססס סUNIX UNIX סס סססס- סס[email protected]

תרגול מס' 8

  • Upload
    landis

  • View
    71

  • Download
    0

Embed Size (px)

DESCRIPTION

תרגול מס' 8. קבצי script ניהול תהליכים ב- UNIX. לי-טל משיח [email protected]. קבצי סקריפט. קבצי script הם קבצים אשר מכילים סדרה של פקודות shell תסריטים אלו מהווים מעין תוכניות הכתובות בשפת ה Shell תוכניות אלו נכתבות בקובץ רגיל ולאחר מכן מורצות - PowerPoint PPT Presentation

Citation preview

Page 1: תרגול מס' 8

88תרגול מס' תרגול מס'

קבצי קבציscriptscript-ניהול תהליכים ב-ניהול תהליכים בUNIXUNIX

[email protected]לי-טל משיח

Page 2: תרגול מס' 8

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

sourcesource . .

>source clean>source clean cleancleanתריץ את התסריט תריץ את התסריט

במידה והקובץ במידה והקובץcleanclean אשר הנו קובץ טקסט רגיל( הכיל את הפקודות )אשר הנו קובץ טקסט רגיל( הכיל את הפקודות( הבאות:הבאות:

rm *.o rm *.o mv ex1 ex1.oldmv ex1 ex1.old

אזי לאחר ביצוע הפקודה, ימחקו כל קבצי ה אזי לאחר ביצוע הפקודה, ימחקו כל קבצי הobjectobject ושם הקובץ ושם הקובץ ex1ex1 ישונה ישונה . .ex1.oldex1.oldל ל

Page 3: תרגול מס' 8

CC--shellshellשפת התסריטים שלשפת התסריטים של ::C-shellC-shellבכתיבת התסריטים נעזר בכל יכולות ה בכתיבת התסריטים נעזר בכל יכולות ה

הגדרה ושמוש במשתניםהגדרה ושמוש במשתנים שמוש ב שמוש בFile name expansionFile name expansion תוכניות שמושיות ב תוכניות שמושיות בUnixUnix– –

-יתרונו של התסריט ב-יתרונו של התסריט בC-shellC-shell הנו יכולתו להריץ תוכניות הנו יכולתו להריץ תוכניות קיים קיים unixunixשכבר נמצאות במערכת בקלות. בכל מערכת שכבר נמצאות במערכת בקלות. בכל מערכת

אשר ניתן לנצלן לצורך אשר ניתן לנצלן לצורך utilitiesutilities– – סט של תוכניות שמושיות סט של תוכניות שמושיות שילובן בתסריטשילובן בתסריט

מבני בקרה ב מבני בקרה בC-shellC-shell תסריטים אינם תחליף לתוכנית אלא משמשים בד"כ כ-"דבק תסריטים אינם תחליף לתוכנית אלא משמשים בד"כ כ-"דבק

חכם" בין תוכניות קיימותחכם" בין תוכניות קיימות גם בעת ביצוע תסריט מתבצעות כל ההחלפות בעת ניתוח גם בעת ביצוע תסריט מתבצעות כל ההחלפות בעת ניתוח

שורת פקודה ע"פ אותו הסדר אשר הוצג בשיעור שעברשורת פקודה ע"פ אותו הסדר אשר הוצג בשיעור שעבר

Page 4: תרגול מס' 8

CShellCShellמבני בקרה במבני בקרה ב--

-ב- בCShellCShell יש מבני בקרה הדומים לאלה אשר יש מבני בקרה הדומים לאלה אשר CCבשפת בשפת

לולאותלולאותמשפטי תנאימשפטי תנאיקפיצה בלתי מותנתקפיצה בלתי מותנת

Page 5: תרגול מס' 8

CShellCShell לולאות בלולאות ב--::repeatrepeatמשפטי משפטי

חוזר על הפקודה חוזר על הפקודהCShell commandCShell command בדיוק בדיוק countcount פעמים.פעמים.

<<repeat 3 echo hello worldrepeat 3 echo hello worldhello worldhello worldhello worldhello worldhello worldhello world

כפי שרואים פקודה זו שמושית גם בצורת עבודה כפי שרואים פקודה זו שמושית גם בצורת עבודהאינטראקטיבית.אינטראקטיבית.

repeatrepeat <count> <cshell command> <count> <cshell command>

Page 6: תרגול מס' 8

CShellCShell לולאות בלולאות ב-- משפטי משפטיwhilewhile::whilewhile )<expression>( )<expression>(

<cshell commands><cshell commands>endend

> source count10> source count1000112233445566778899

# count10 script:# count10 script:@ i = 0@ i = 0while )$i<10(while )$i<10(

echo $iecho $i@ i++@ i++

endend

Page 7: תרגול מס' 8

CShellCShell לולאות בלולאות ב--

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

הרשימה יכולה להיות כתובה במפורש, או להתאים לתבנית בדומה לשמות של הרשימה יכולה להיות כתובה במפורש, או להתאים לתבנית בדומה לשמות שלקבציםקבצים

נניח כי במדריך מסוים קיימים הקבצים הבאים:נניח כי במדריך מסוים קיימים הקבצים הבאים:amortize.c, helloworld.c, prog.camortize.c, helloworld.c, prog.c

אזי, הפקודה:אזי, הפקודה:foreach F )*.c(foreach F )*.c(

echo $Fecho $Fendend

תדפיס:תדפיס:amortize.camortize.chelloworld.chelloworld.cprog.cprog.c

בלולאות בלולאותforeachforeach -ו- ו whilewhile ניתן גם להשתמש בפקודות ניתן גם להשתמש בפקודות breakbreak -ו- ו continuecontinue -כמו ב- כמו ב CC..

foreachforeach <variable> )<list of words>( <variable> )<list of words>(<cshell commands><cshell commands>

endend

::foreachforeachמשפטימשפטי

Page 8: תרגול מס' 8

משפטי תנאימשפטי תנאי

הינם: הינם:ififהתנאים אותם ניתן לבחון במשפט ה התנאים אותם ניתן לבחון במשפט ה :תנאים חשבוניים: תנאים חשבונייםif )$a > 0(if )$a > 0(… … :השוואת מחרוזות: השוואת מחרוזותif )$a == "kiko"(if )$a == "kiko"(… … תנאים יחודיים ל תנאים יחודיים לc-shellc-shell::

ifif )<expression>( <one cshell command> )<expression>( <one cshell command>אואו

ifif )<expression>( )<expression>( thenthen<cshell commands><cshell commands>

[[elseelse<cshell commands>]<cshell commands>]

endifendif

::ififמפשטימפשטי

if )-f diary(if )-f diary(lpr diarylpr diary

endifendif, אם התשובה חיובית, מדפיס אותו, אם התשובה חיובית, מדפיס אותוdiarydiaryבודק אם קיים קובץ "פשוט" בשם בודק אם קיים קובץ "פשוט" בשם

if )-d $dir( thenif )-d $dir( thencd $dircd $dir……....

endifendif מכיל שם מדריך, ואם כן עובר אליו מכיל שם מדריך, ואם כן עובר אליוdirdirבודק אם המשתנה בודק אם המשתנה

Page 9: תרגול מס' 8

משפטי תנאי - התאמה בין משפטי תנאי - התאמה בין מחרוזותמחרוזות

פרט להשוואה רגילה בין שתי מחרוזות )המתבצעת ע"י האופרטור ==( ניתן פרט להשוואה רגילה בין שתי מחרוזות )המתבצעת ע"י האופרטור ==( ניתןלבדוק התאמה בין מחרוזות באופן חלקי באמצעות האופרטור ~= לבדוק התאמה בין מחרוזות באופן חלקי באמצעות האופרטור ~=

בצד שמאל של האופרטור חייבת להופיע מחרוזת מלאה אך בצד ימין יכולה בצד שמאל של האופרטור חייבת להופיע מחרוזת מלאה אך בצד ימין יכולה שמשמעותם שמשמעותם ] [] [, או , או ??, , $$להופיע מחרוזת הכוללת סימנים מיוחדים כגון: להופיע מחרוזת הכוללת סימנים מיוחדים כגון:

תוארה בשקפים קודמיםתוארה בשקפים קודמים~ השלילה של האופרטור ~= היא ~השלילה של האופרטור ~= היא!!. . > 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 NOTNOT

Page 10: תרגול מס' 8

משפטי תנאימשפטי תנאיswitchswitch )<string>( )<string>(

casecase <string1>: <string1>: <cshell commands> <cshell commands> [[breakswbreaksw]]

casecase <string2>: <string2>: <cshell commands><cshell commands>[[breakswbreaksw]]

.. .. ..

casecase <string_n>: <string_n>: <cshell commands><cshell commands>

[[breakswbreaksw]][[defaultdefault: :

<cshell commands>]<cshell commands>]endswendsw

switch )$F(switch )$F( case "*.c":case "*.c":

lpr $Flpr $Fbreakswbreaksw

case "*.o":case "*.o":rm $Frm $Fbreakswbreaksw

endswendsw

::switchswitchמשפטימשפטי

Page 11: תרגול מס' 8

קפיצה בלתי מותנתקפיצה בלתי מותנת::gotogotoמשפטי משפטי

>:>:labellabel<<- קופץ למקום המסומן ב- - קופץ למקום המסומן ב- gotogoto <label> <label>

if )-f diary( then if )-f diary( then lpr diarylpr diary

else goto endprogelse goto endprogendifendifif )-f diary2( thenif )-f diary2( then

lpr diarylpr diary22endifendifendprog:endprog:

אז מדפיסים אותו וממשיכים, אחרת קופצים לסוף התוכנית. אז מדפיסים אותו וממשיכים, אחרת קופצים לסוף התוכנית.diarydiaryאם קיים קובץ אם קיים קובץ באופן כללי. באופן כללי.gotogotoשמושי לטיפול בשגיאות, אך )כרגיל!( לא רצוי להשתמש ב שמושי לטיפול בשגיאות, אך )כרגיל!( לא רצוי להשתמש ב

Page 12: תרגול מס' 8

הרצת קבצי סקריפטהרצת קבצי סקריפט בשתי דרכים: בשתי דרכים: scriptscriptניתן להריץ את קבצי ה ניתן להריץ את קבצי ה

להריץ את הקובץ בכל פעם ע"י להריץ את הקובץ בכל פעם ע"יsource <file namesource <file name<<-הקובץ מורץ בתוך ה-הקובץ מורץ בתוך הshellshell הנוכחי, ולכן יש לו גישה למשתנים שהגדרנו הנוכחי, ולכן יש לו גישה למשתנים שהגדרנו

ושינויים שהוא יבצע במשתנים "ייזכרו"ושינויים שהוא יבצע במשתנים "ייזכרו" לקבוע את הקובץ כ לקבוע את הקובץ כexecutableexecutable פעם אחת, להריץ אותו ע"י פעם אחת, להריץ אותו ע"י >>file namefile name<<

> chmod +x myscript> chmod +x myscript. כעת, הפקודה:. כעת, הפקודה:executableexecutable ל ל myscriptmyscriptהופך את הקובץ הופך את הקובץ

> myscript> myscript חדש משל עצמו, כך חדש משל עצמו, כך shellshell, בתוך , בתוך scriptscript כקובץ כקובץ myscriptmyscriptתריץ את הקובץ תריץ את הקובץ

ששינוייםששינויים שיתבצעו למשתנים לא ייזכרו "מחוץ" להרצה שיתבצעו למשתנים לא ייזכרו "מחוץ" להרצה

Page 13: תרגול מס' 8

הרצת קבצי סקריפטהרצת קבצי סקריפט כל קובץ כל קובץscriptscript:שרוצים להריץ בצורה זו חייב להתחיל עם השורה הבאה: שרוצים להריץ בצורה זו חייב להתחיל עם השורה הבאה

#! /usr/local/bin/tcsh -f#! /usr/local/bin/tcsh -f

במחשבים שונים כתובת קובץ ההפעלה יכולה להשתנות. במחשבים שונים כתובת קובץ ההפעלה יכולה להשתנות. , שבהינתן שם של קובץ הפעלה שנמצא באחד, שבהינתן שם של קובץ הפעלה שנמצא באחדwhichwhichניתן למצוא מהי באמצעות הפקודה ניתן למצוא מהי באמצעות הפקודה

מכיר, מחזירה את הכתובת המלאה שלו. מכיר, מחזירה את הכתובת המלאה שלו.shellshell-ים שה--ים שה-PATHPATHה-ה-

יש להשתמש יש להשתמשshellshellבאיזה באיזה לצורך הרצת התסריט לצורך הרצת התסריט

לא לקרוא את קבצי לא לקרוא את קבציshellshellאומר ל-אומר ל-האתחול שנקראים בדרך כללהאתחול שנקראים בדרך כלל

Page 14: תרגול מס' 8

setupsetupקבציקבצי מיוחדים אשר מורצים אוטומטית ע"י המערכת בזמנים מיוחדים אשר מורצים אוטומטית ע"י המערכת בזמניםscriptscript הם קבצי הם קבצי setupsetupקבצי קבצי

מסוימים.קבצים אלו הם:מסוימים.קבצים אלו הם:..loginloginמבוצע עם כניסת משתמש לחשבונו - מבוצע עם כניסת משתמש לחשבונו - ..cshrccshrc מבוצע בהתחלת כל - מבוצע בהתחלת כל - shellshell

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

< < cat .cshrccat .cshrcset path = )$path ./(set path = )$path ./(set history=40set history=40alias ll 'ls -al'alias ll 'ls -al'alias m 'more'alias m 'more'alias . 'pwd'alias . 'pwd'alias .. 'cd ..'alias .. 'cd ..'alias ... 'cd ../..'alias ... 'cd ../..'

Page 15: תרגול מס' 8

פרמטרים לקבצי סקריפטפרמטרים לקבצי סקריפט ניתן לתת פרמטרים לקבצי ניתן לתת פרמטרים לקבציscriptscript ניתן להתיחס לפרמטרים אלה בתוך . ניתן להתיחס לפרמטרים אלה בתוך .

כדלקמן: כדלקמן:scriptscriptקובץ ה- קובץ ה- $0$0הפקודה עצמה - הפקודה עצמה - $1$1 :באופן כללי( באופן כללי: - הפרמטר הראשון( הפרמטר הראשון - {${$nn}}-מתייחס לפרמטר ה- מתייחס לפרמטר ה nn.).)*$*$רשימת כל הפרמטרים הנתונים לפקודה - רשימת כל הפרמטרים הנתונים לפקודה - {{#{$ -#{$ -argvargv.מציין את מספר הפרמטרים הנתונים לפקודה. מציין את מספר הפרמטרים הנתונים לפקודה - -{${$argv[n]argv[n]}} מציין את הפרמטר מספר מציין את הפרמטר מספר nn..

שתפקידו להדפיס את הקבצים שהוא מקבל כפרמטרים שתפקידו להדפיס את הקבצים שהוא מקבל כפרמטריםprintprintקובץ בשם קובץ בשם #! /usr/local/bin/tcsh -f#! /usr/local/bin/tcsh -fforeach F )$*(foreach F )$*(

lpr $Flpr $Fendend

: :דוגמת הרצהדוגמת הרצה> print a.c b.c prog.c> print a.c b.c prog.c

Page 16: תרגול מס' 8

קריאת שורות מקבציםקריאת שורות מקבצים קוראת שורה מה - קוראת שורה מה - (($<($<(הפקודה הפקודה standard inputstandard input.לתור רשימה. לתור רשימה

> set str2 = )$<(> set str2 = )$<(This line is typed by the userThis line is typed by the user> echo $str2> echo $str2This line is typed by the userThis line is typed by the user> echo $str2[1]> echo $str2[1]ThisThis> echo $str2[2]> echo $str2[2]lineline

כאן נוצרה רשימה כאן נוצרה רשימהstr2str2אשר התוכן שלה הוא שורת הקלט מה אשר התוכן שלה הוא שורת הקלט מה standard standard inputinput- -

!!!!!!מקובץמקובץ אפשרות לקרוא שורות קלט אפשרות לקרוא שורות קלט cshellcshellאין ב-אין ב- standard inputstandard inputרק מה- רק מה-

Page 17: תרגול מס' 8

קריאת שורות מקבציםקריאת שורות מקבצים-כאשר רוצים לקרוא קובץ, כותבים את ה-כאשר רוצים לקרוא קובץ, כותבים את הscriptscript

שמטפל בשורות הקובץ כאילו הוא מקבל קלט שמטפל בשורות הקובץ כאילו הוא מקבל קלט standard inputstandard inputמה-מה-

לאחר מכן יוצרים קובץ לאחר מכן יוצרים קובץscriptscript ,"חדש - "מעטפת", חדש - "מעטפת המקורי, תוך שהוא המקורי, תוך שהוא scriptscriptשתפקידו להפעיל את ה-שתפקידו להפעיל את ה-

מפנה אליו את הקובץ שאותו רוצים לקרואמפנה אליו את הקובץ שאותו רוצים לקרוא כלומר: באמצעות כלומר: באמצעותpipeliningpipelining אנחנו גורמים לקובץ אנחנו גורמים לקובץ

standard inputstandard inputשאנחנו רוצים לקרוא להופיע בתור ה-שאנחנו רוצים לקרוא להופיע בתור ה-של הסקריפטשל הסקריפט

Page 18: תרגול מס' 8

דוגמאדוגמא

>cat footballAlon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer ShevaRonen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-AvivReuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-AvivEyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-HaifaAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemIzak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-HiafaAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-TikvaRonen Har.3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa

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

בתאריך מסוים, שם הקבוצה בה הוא שיחק ושם הקבוצה היריבה.בתאריך מסוים, שם הקבוצה בה הוא שיחק ושם הקבוצה היריבה.

Page 19: תרגול מס' 8

דוגמאדוגמא, אשר יקבל כפרמטר שם מלא של שחקן וידפיסplayer בשם scriptברצוננו לכתוב

בהן מופיע שם השחקן, ובנוסף ידפיס את סה"כfootballאת כל השורות של הקובץ מספר השערים שהוא הבקיע.

יהיה:.Alon Mizלדוגמא, הפלט עבור שורת הקלט

> player “Alon Miz.”Alon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikvatotal number of goals: 6

Page 20: תרגול מס' 8

פתרוןפתרון footballfootball לא נוכל לבצע קריאה שורה-שורה של הקובץ לא נוכל לבצע קריאה שורה-שורה של הקובץ playerplayer בשם בשם scriptscriptב - ב -

אחר אחרscriptscriptולכן נשתמש בו בתור מעטפת בלבד, ואת העבודה האמתית נבצע ב-ולכן נשתמש בו בתור מעטפת בלבד, ואת העבודה האמתית נבצע ב-..standard inputstandard input אשר יבצע את מבוקשנו על קלט מה- אשר יבצע את מבוקשנו על קלט מה-calc_totalcalc_totalבשם בשם , על ידי הפנייה של, על ידי הפנייה שלcalc_totalcalc_total יכול להשתמש ב- יכול להשתמש ב-playerplayer המעטפת המעטפת scriptscriptכעת, כעת,

שלו. שלו.standard inputstandard input ל- ל-footballfootballהקובץ הקובץ

נציג את שני התסריטים לביצוע המשימה:נציג את שני התסריטים לביצוע המשימה:

Page 21: תרגול מס' 8

פתרוןפתרון

> cat calc-total> cat calc-total#!/usr/local/bin/tcsh -f#!/usr/local/bin/tcsh -fset line = ($<)set line = ($<)set sum = 0set sum = 0while (${#line} != 0)while (${#line} != 0) @ sum = $sum + $line[3]@ sum = $sum + $line[3] echo $lineecho $line set line = ($<)set line = ($<)endendecho "total number of goals: $sum" echo "total number of goals: $sum"

> cat player> cat player#!/usr/local/bin/tcsh -f#!/usr/local/bin/tcsh -fgrep "$1" football | calc-totalgrep "$1" football | calc-total

Page 22: תרגול מס' 8

דוגמא מסכמתדוגמא מסכמת המדרג את השחקנים אשר שמותיהם המלאים מועברים כפרמטר, המדרג את השחקנים אשר שמותיהם המלאים מועברים כפרמטר,scoresscores בשם בשם scriptscriptלפנינו לפנינו

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

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

>cat football>cat footballAlon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivAlon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer ShevaIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer ShevaRonen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-AvivRonen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-AvivReuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-AvivReuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-AvivEyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Eyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-HaifaIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-HaifaAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemIzak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-HiafaIzak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-HiafaAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-TikvaAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-TikvaRonen Har.3 27/11/93 Hapoel-Tel-Aviv Macabi-HaifaRonen Har.3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa

Page 23: תרגול מס' 8

דוגמא מסכמתדוגמא מסכמתדוגמא להפעלת הסקריפט: דוגמא להפעלת הסקריפט:

> scores "Alon Miz." "Izak Zoh." "Ronen Ha." "Reuven A."> scores "Alon Miz." "Izak Zoh." "Ronen Ha." "Reuven A."1 Alon Miz. 61 Alon Miz. 61 Ronen Ha. 61 Ronen Ha. 62 Izak Zoh. 42 Izak Zoh. 43 Reuven A. 23 Reuven A. 2

Page 24: תרגול מס' 8

פתרוןפתרון> cat scores> cat scores#!/usr/local/bin/tcsh -f#!/usr/local/bin/tcsh -f@ i = 1@ i = 1while ) $i <= $}#argv{ (while ) $i <= $}#argv{ ( grep "$}argv[$i]{" football | calc_score >>! tempgrep "$}argv[$i]{" football | calc_score >>! temp @ i++@ i++endendsort -n +2 -r temp | calc_placesort -n +2 -r temp | calc_placeif )-f temp( thenif )-f temp( then rm -f temprm -f tempendifendif

יחזיר את שם השחקן וסה"כיחזיר את שם השחקן וסה"כמס' הגולים שהבקיע מס' הגולים שהבקיע

ימספר את השחקנים ימספר את השחקנים בהתאם לדירוגםבהתאם לדירוגם

Page 25: תרגול מס' 8

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

> cat calc_score> cat calc_score#!/usr/local/bin/tcsh -f#!/usr/local/bin/tcsh -fset line = )$<(set line = )$<(set sum = 0set sum = 0set player_name = )$line[1-2](set player_name = )$line[1-2](while )$}#line{ != 0(while )$}#line{ != 0( @ sum = $sum + $line[3]@ sum = $sum + $line[3] set line = )$<(set line = )$<(endendecho "$player_name $sum"echo "$player_name $sum"

Page 26: תרגול מס' 8

UNIXUNIXבקרת תהליכים בבקרת תהליכים ב--UnixUnix היא מערכת הפעלה המסוגלת לשרת מספר רב של היא מערכת הפעלה המסוגלת לשרת מספר רב של

משתמשים בו זמנית, וכמו כן כל משתמש יכול להריץ בו זמנית משתמשים בו זמנית, וכמו כן כל משתמש יכול להריץ בו זמנית מספר רב של תהליכיםמספר רב של תהליכים

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

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

Page 27: תרגול מס' 8

יצירת תהליכיםיצירת תהליכים ישנן שתי צורות להריץ תוכניות: ישנן שתי צורות להריץ תוכניות:UnixUnixב - ב -

foregroundforegroundהרצה בחזית הרצה בחזית :מתבצעת ע"י כתיבת הפקודה:מתבצעת ע"י כתיבת הפקודה >>commandcommand<<-פקודה המורצת בחזית גורמת ל-פקודה המורצת בחזית גורמת לpromptprompt להיעלם עד לסיום הפקודה ולכן לא להיעלם עד לסיום הפקודה ולכן לא

נוכל להקליד פקודה נוספת כל עוד הפקודה הנוכחית לא הסתיימהנוכל להקליד פקודה נוספת כל עוד הפקודה הנוכחית לא הסתיימהבחזית יכולה להתבצע פקודה אחת לכל היותרבחזית יכולה להתבצע פקודה אחת לכל היותר

backgroundbackgroundהרצה ברקע הרצה ברקע :& מתבצעת ע"י כתיבת הפקודה בתוספת &: מתבצעת ע"י כתיבת הפקודה בתוספת >>commandcommand < <&&

>gcc Calc.c -o Calc >gcc Calc.c -o Calc ..הפקודה מורצת בחזיתהפקודה מורצת בחזית

>gcc Calc.c -o Calc &>gcc Calc.c -o Calc &>>

..הפקודה מורצת ברקעהפקודה מורצת ברקע

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

שתתבצענה במקביל לפקודה שהורצה ברקע שתתבצענה במקביל לפקודה שהורצה ברקע

Page 28: תרגול מס' 8

ניהול תהליכיםניהול תהליכיםshellshellניתן לבדוק אילו תהליכים קיימים ב-ניתן לבדוק אילו תהליכים קיימים ב- jobsjobsבעזרת הפקודה בעזרת הפקודה

סימן ה-"+" מייצג את התהליך ה"נוכחי" – התהליך שהוא ברירת המחדל סימן ה-"+" מייצג את התהליך ה"נוכחי" – התהליך שהוא ברירת המחדללפקודות שנציג בהמשךלפקודות שנציג בהמשך

סימון ה-"-" מייצג את ה"יורש" – התהליך שיקבל את סימן ה-"+" אחרי סימון ה-"-" מייצג את ה"יורש" – התהליך שיקבל את סימן ה-"+" אחרישהתהליך הנוכחי יסיים את ריצתושהתהליך הנוכחי יסיים את ריצתו

<< more forever.c more forever.cmain)(main)(} } printf)"I am going to run forever !!!\n"(;printf)"I am going to run forever !!!\n"(; while )1( ;while )1( ;{{> forever &> forever &[1] 587[1] 587> I am going to run forever !!!> I am going to run forever !!!> jobs> jobs[1] + Running forever[1] + Running forever> kill -9 %1> kill -9 %1> > [1] Killed forever[1] Killed forever

>jobs>jobs[1] + Running cc prog.c[1] + Running cc prog.c[2] - Running troff -me big_doc.roff[2] - Running troff -me big_doc.roff

פקודות נוספות המאפשרות הצגה של התהליכיםפקודות נוספות המאפשרות הצגה של התהליכים. . toptop ו- ו-pspsשקיימים כרגע הן: שקיימים כרגע הן:

שלהן שלהןmanmanניתן למצוא את המידע בקבצי ה-ניתן למצוא את המידע בקבצי ה-

Page 29: תרגול מס' 8

פקודות לניהול תהליכיםפקודות לניהול תהליכים בכל הפקודות שנלמד בהמשך לניהול תהליכים יש מספר דרכים לציין בכל הפקודות שנלמד בהמשך לניהול תהליכים יש מספר דרכים לציין

תהליך מסוים:תהליך מסוים:%%nn תהליך מספר - תהליך מספר - nn..%%ss התהליך אשר שורת פקודתו מתחילה במחרוזת - התהליך אשר שורת פקודתו מתחילה במחרוזת - ss..?%?%ss - - jobjob אשר שורת פקודתו מכילה את המחרוזת אשר שורת פקודתו מכילה את המחרוזת ss..%%%%.)"+"התהליך הנוכחי )התהליך שסומן ב"+"(. - התהליך הנוכחי )התהליך שסומן ב - -%-%.)"-"התהליך הבא )התהליך שסומן ב"-"(. - התהליך הבא )התהליך שסומן ב - :לדוגמא כל המחרוזות הבאות מתייחסות לאותו תהליך מהדוגמא הקודמת:לדוגמא כל המחרוזות הבאות מתייחסות לאותו תהליך מהדוגמא הקודמת

%1%1%forever%forever%for%for%?ever%?ever

Page 30: תרגול מס' 8

העברת תהליכים לחזיתהעברת תהליכים לחזית

מעבירה את התהליך הנוכחי או מעבירה את התהליך הנוכחי או]]jobIDsjobIDs[[.לחזית. לחזית fgfg [ [jobIDsjobIDs]]

> more try_input.c> more try_input.cmain)(main)(}} char str[20];char str[20]; printf)"I shall try to eat something"(;printf)"I shall try to eat something"(; scanf)"%s" , str(;scanf)"%s" , str(; printf)"%s" , str(;printf)"%s" , str(;{{

> try_input&> try_input&[1] 828[1] 828> I shall try to eat something> I shall try to eat something[1] + Suspended )tty input( try_input[1] + Suspended )tty input( try_input> jobs> jobs[1] + Suspended )tty input( try_input[1] + Suspended )tty input( try_input> fg %1> fg %1try_inputtry_inputgoodies goodies goodiesgoodies> >

Page 31: תרגול מס' 8

העברת תהליך לרקעהעברת תהליך לרקע

מעבירה את התהליך הנוכחי או מעבירה את התהליך הנוכחי או]]jobIDsjobIDs[[לרקע לרקע

bgbg [ [jobIDsjobIDs] ]

> jobs> jobs[1] + Suspended forever[1] + Suspended forever> bg %1> bg %1[1] forever &[1] forever &> jobs> jobs[1] Running forever[1] Running forever>>

Page 32: תרגול מס' 8

השעיית תהליךהשעיית תהליךCtrl-zCtrl-z משעה את התהליך המתבצע כרגע בחזית. תהליך מושעה ניתן - משעה את התהליך המתבצע כרגע בחזית. תהליך מושעה ניתן -

..bgbg או או fgfgלהעביר לחזית או לרקע ע"י שימוש בפקודות להעביר לחזית או לרקע ע"י שימוש בפקודות הפקודההפקודהstopstop jobIDsjobIDs משעה את משעה את jobIDsjobIDs

> nroff -ms report> nroff -ms reportCtrl-zCtrl-z[1] + Suspended nroff[1] + Suspended nroff<<bg %bg %

> emacs &> emacs &[1] 982[1] 982> forever&> forever&[2] 991[2] 991> jobs> jobs[1] + Running emacs[1] + Running emacs[2] - Running forever[2] - Running forever> stop %2> stop %2> > [2] + Suspended )signal( forever[2] + Suspended )signal( forever> jobs> jobs[1] - Running emacs[1] - Running emacs[2] + Suspended )signal( forever[2] + Suspended )signal( forever> >

Page 33: תרגול מס' 8

הריגת תהליךהריגת תהליךCtrl-cCtrl-cהורג את התהליך המתבצע כרגע בחזית - הורג את התהליך המתבצע כרגע בחזית - הפקודההפקודהkillkill -9-9 jobIDjobID הורגת את התהליך הורגת את התהליך jobIDjobID..

למרות שמה האכזרי, פקודת למרות שמה האכזרי, פקודתkillkill .משמשת באופן כללי לשליחת הודעות. משמשת באופן כללי לשליחת הודעות בפועל שתי ההודעות הנפוצות ביותר שאנו שולחים לתהליכים הן "תמות" בפועל שתי ההודעות הנפוצות ביותר שאנו שולחים לתהליכים הן "תמות"

((SIGTERMSIGTERM( "!ו"תמות תכף ומייד )( "!ו"תמות תכף ומייד )SIGKILLSIGKILL.).) הפרמטר לפקודת הפרמטר לפקודתkillkill" בנוסף למזהה התהליך, הוא ", בנוסף למזהה התהליך, הוא ,--nn כאשר ", כאשר ,"nn הוא הוא

מספר מזהה של הודעה. אם לא מוסיפים מספר, ברירת המחדל היא מספר מזהה של הודעה. אם לא מוסיפים מספר, ברירת המחדל היא – "תמות". ההודעה שמזוהה עם – "תמות". ההודעה שמזוהה עם 1515שליחת ההודעה שמזוהה עם המספר שליחת ההודעה שמזוהה עם המספר

היא "תמות תכף ומייד!". ההבדל בן שתי ההודעות היא ש"תמות" היא "תמות תכף ומייד!". ההבדל בן שתי ההודעות היא ש"תמות" 99המספר המספר מאפשרת לתהליך להרוג את עצמו בצורה מסודרת )כמו ביצוע סגירה של מאפשרת לתהליך להרוג את עצמו בצורה מסודרת )כמו ביצוע סגירה של

במערכת ההפעלה( ואפילו במערכת ההפעלה( ואפילו shut downshut downהמחשב על ידי לחיצה על הכפתור המחשב על ידי לחיצה על הכפתור להתעלם מההוראה, ואילו "תמות תכף ומייד!" הורגת את התהליך תכף להתעלם מההוראה, ואילו "תמות תכף ומייד!" הורגת את התהליך תכף

ומייד )כמו ביצוע סגירה של המחשב על ידי ניתוק מהחשמל(ומייד )כמו ביצוע סגירה של המחשב על ידי ניתוק מהחשמל(

<< forever& forever&[1] 660[1] 660> I am going to run forever !!!> I am going to run forever !!!> kill -9 %fo> kill -9 %fo> jobs> jobs>>