1 / 50

תרגול מס' 2

תרגול מס' 2. כתיבת תסריטים ב- bash בקרת תהליכים ב- UNIX שאלות ממבחנים. תסריטים. הרצת תסריטים מבני בקרה ב- bash דוגמאות השוואה בין C ו- bash. אוטומטיזציה. נניח (מקרה היפותטי לחלוטין) שברשותנו קבצי בדיקה ופלט לתכנית שלנו וברצוננו לבדוק את נכונות התכנית מול קבצים אלו

coby
Download Presentation

תרגול מס' 2

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. תרגול מס' 2 כתיבת תסריטים ב-bash בקרת תהליכים ב-UNIX שאלות ממבחנים

  2. תסריטים הרצת תסריטים מבני בקרה ב-bash דוגמאות השוואה בין C ו-bash מבוא לתכנות מערכות - 234122

  3. אוטומטיזציה • נניח (מקרה היפותטי לחלוטין) שברשותנו קבצי בדיקה ופלט לתכנית שלנו וברצוננו לבדוק את נכונות התכנית מול קבצים אלו • צריך לכתוב 3 פקודות לכל בדיקה • גם עם שימוש במנגנון ההיסטוריה הרצת הבדיקותמעיקה ולוקחת הרבה זמן מיותר • הפתרון:אוטומטיזציהשל הרצת הפקודות. ניצור קובץ אשר יכיל "תסריט" לפיו יורצו כל הפקודות לפי הסדר > mtm_rentals< test1.in > tmpout 2> tmperr > diff expout1 tmpout > diff experr1 tmperr מבוא לתכנות מערכות - 234122

  4. הרצת תסריט בעזרתsource • ניתן להריץ קובץ המכיל פקודות Bash (להלן תסריט - script) על ידי הפקודה source • הפקודות יבוצעו ב-Shell הנוכחי כאילו נכתבו בשורת הפקודה אחת אחרי השניה > source run_tests Running test 1 Running test 2 Running test 3 run_tests echo Running test 1 mtm_rentals< test1.in > tmpout 2> tmperr diff expout1 tmpout diff experr1 tmperr echo Running test 2 mtm_rentals< test2.in > tmpout 2> tmperr diff expout2 tmpout diff experr2 tmperr echo Running test 3 mtm_rentals< test3.in > tmpout 2> tmperr diff expout3 tmpout diff experr3 tmperr מבוא לתכנות מערכות - 234122

  5. תסריטי אתחול • בהתחברות של משתמש למערכת מורץ התסריט .login אשר בתיקית הבית של המשתמש • בפתיחת Shell חדש של Bash מורץ התסריט .bashrc • הרצות תסריטי האתחול מתבצעות באמצעות source, ולכן הן משפיעות על מצב ה-Shell .bashrc .login PATH=$PATH:. alias ll="ls -l" alias cdex2="cd ~mtm/public/1011a/ex2" alias GCC="gcc -std=c99 -Wall \ -pedantic-errors -Werror" # welcome message echo ------ Welcome `whoami` !-------- echo You are in `pwd` directory of \ `hostname` echo OS is `uname -s` # echo disk usage is `du -sh | cut -f1` echo `who | wc -l` users are logged in echo Today is `date` מבוא לתכנות מערכות - 234122

  6. הרצת תסריט כקובץ הרצה • ניתן להריץ תסריט כפקודה: • בתחילת התסריט יש להוסיף את השורה #!/bin/bash • #! מסמן ל-Unix שהשורה הראשונה בקובץ מגדירה את התכנית לביצוע שאר הפקודות בקובץ • /bin/bashהוא שם התכנית לביצוע הפקודות, במקרה שלנו Bash • בנוסף יש להוסיף הרשאת ריצה לקובץ • כעת ניתן להריץ את התסריט כמו תכנית רגילה • בניגוד להרצה באמצעות פקודת source התסריט יבוצע בתהליך Shell חדש אשר יסתיים בסוף ריצת התסריט מבוא לתכנות מערכות - 234122

  7. הרצת תסריט כקובץ הרצה • נמיר את תסריט הרצת הבדיקות שלנו לקובץ הרצה: • בעיה חדשה: התסריטמתחיללהסתבך, הוספת בדיקות נוספותמשכפלת קוד בתסריט ולא נוחה (ייתכנו אלפי בדיקות) • פתרון: נשתמש במבני בקרה (תנאים ולולאות) בדומה לשפת C > chmoda+xrun_tests > ./run_tests Running test 1 Running test 2 Running test 3 run_tests #!/bin/bash echo Running test 1 mtm_rentals < test1.in > tmpout 2> tmperr diff expout1 tmpout diff experr1 tmperr echo Running test 2 mtm_rentals < test2.in > tmpout 2> tmperr diff expout2 tmpout diff experr2 tmperr echo Running test 3 mtm_rentals < test3.in > tmpout 2> tmperr diff expout3 tmpout diff experr3 tmperr מבוא לתכנות מערכות - 234122

  8. מבני בקרה • Bash מאפשרת שימוש במבני בקרה (למשל whileו-if) בתסריטים ובשורת הפקודה • מבני הבקרה משתמשים בתנאיםבדומה למבני הבקרה שבשפת C • השוואת ערכי מספרים • השוואת מחרוזות • ועוד... • נעבור על מספר מבני בקרהותנאים שימושיים > for ((i = 1; $i < 10; i++ )); do > if (($i % 3 == 0)); then > echo 3 divides $i > fi > done 3 divides 3 3 divides 6 3 divides 9 מבוא לתכנות מערכות - 234122

  9. while • ניתן ליצור לולאות whileב-bash: while <expression>; do<command1><command2>...done • הפקודות בגוף הלולאה יבוצעו כל עוד <expression> ממשיך להתקיים • לולאות while כמו שאר מבני הבקרה ניתנות לביצוע ישירותמהטרמינל > i=1 > while ((i <= 3)); do > echo $i > let i++ > done 1 2 3 run_tests > ./run_tests Running test 1 Running test 2 Running test 3 #!/bin/bash i=1 while ((i <= 3)); do echo Running test $i mtm_rentals< test${i}.in \ > tmpout 2> tmperr diff expout${i} tmpout diff experr${i} tmperr let i++ done מבוא לתכנות מערכות - 234122

  10. for • שימוש נוסף ב-for הוא מעבר על על איברי המערך: for <varname> in <array> ; do <command1> <command2> ...done • <varname> הוא שם המשתנה שיכיל בכל פעם איבר מהרשימה • <array> היא רשימה של מחרוזות • העדיפו להשתמש בשיטה זו על פני שימוש מפורש באינדקסים מבוא לתכנות מערכות - 234122

  11. for • לולאת for משמשת בדומה לשפת C למעבר נוח יותר על תחום מספרים > ./run_tests Running test1.in Running test2.in Running test3.in run_tests #!/bin/bash for ((i = 1; i <= 3; i++)); do echo Running test$i mtm_rentals < test${i}.in > tmpout 2> tmperr diff expout$itmpout diff experr$itmperr done מבוא לתכנות מערכות - 234122

  12. if • ניתן להגדיר ב-bash משפטי תנאי בשתי גרסאות if <expression>; then <command1> <command2> ... fi • ניתן להוסיף else ופקודות אשר יתבצעו אם התנאי אינו מתקיים if<expression>; then <commands> else <commands>fi > i=1 > if (( $i> 0 )); then > echo POSITIVE > else > echo NEGATIVE > fi POSITIVE מבוא לתכנות מערכות - 234122

  13. ביטויים אפשריים ב-if ו-while • קיימות מספר אפשרויות לכתיבת התנאים בלולאות ומשפטי תנאי • ניתן לרשום תנאים בתוך [[ ]]: • האופרטורים > ו-< משווים מחרוזות (לפי סדר לקסיקוגרפי) • האופרטור == מאפשר התאמת מחרוזת לתבנית • ניתן לבצע השוואת על ערכי מספרים בעזרת דגלים כגון -eq, -gt, -le • חשוב להקפיד על תו הרווח בין הסוגריים לתוכן התנאי כדי למנוע שגיאות ב-bash > str1=Hello > if [[ $str1 == Hello ]]; then echo true; fi true > if [[ hello == Hello ]]; then echo true; fi > if [[ 11 < 7 ]]; then echo true; fi true > if [[ 11 -le 7 ]]; then echo true; fi > if [[ 11 -eq 11 ]]; then echo true; fi true > if [[ 0 -eq Hello ]]; then echo true; fi true זו אינה השוואת ערכים מספריים עבור ערך שאינו מייצג מספר משתמשים ב-0 לחישוב מבוא לתכנות מערכות - 234122

  14. התאמת מחרוזות • בתוך תנאי מהצורה [[ ]], האופרטור == מאפשר התאמת מחרוזת לתבנית • הארגומנט השמאלי הוא מחרוזת רגילה • הארגומנט הימני הוא תבנית אשר יכולה לכלול את הסימנים *, ? ו-[ ] כמו שתואר עבור תבניות של שמות קבצים • ניתן להשתמש בגרשיים כפולים "" על מנת לבטל את המשמעות המיוחדת של התווים הללו • האופרטור =! הוא השלילה של אופרטור ההתאמה == • המשמעות של = ו-== זהה > end_with_z="some string with z" > if [[ "$end_with_z" = *[zZ] ]]; then echo match; fi match > if [[ "this string start with t" = t* ]]; then echo true; fi true > if [[ "this string doesn't start with t" = [^t]* ]]; then echo true; fi > file=test4.in > if [[ $file = test*.in]]; then echo test file; fi test file > if [[ "string doesn't start with t" != t* ]]; then echo true; fi true מבוא לתכנות מערכות - 234122

  15. ביטויים אפשריים ב-if ו-while • בתוך [[ ]] ניתן להשתמש בתנאים מועילים נוספים, למשל: • התנאי -f <filename> בודק האם קיים קובץ בשם <filename> • התנאי -d <dirname> בודק האם קיימת תיקייה בשם <dirname> • ניתן לבדוק תנאים מורכבים יותר: • ניתן להשתמש באופרטורים &&, ||, ו-! כמו בשפת C • הקפידו להשאיר רווח אחרי ! כדי להימנע משגיאות בגלל מנגנון ההיסטוריה • ניתן להשתמש בסוגריים כדי לקבוע את הקדימויות > if [[ -f a.txt ]]; then echo file exists; fi > cat > a.txt Hello world! > if [[ -f a.txt ]]; then echo file exists; fi file exists > mkdirmtm > if [[ ! (-f b.txt && -d mtm) ]]; then echo yes; fi yes מבוא לתכנות מערכות - 234122

  16. ביטויים אפשריים ב-if ו-while • ניתן להגדיר תנאי בתוך (()) • בתוך (()) האופרטורים ==, =!, > ו- < מתייחסים לערכים מספריים • אין צורך לרשום $ לפני שם משתנה • ניתן לבצע פעולות חשבוניות • תנאים המוגדרים בעזרת (())מתנהגים כמו ביצוע פעולות חשבוניות בעזרת (())$ > if (( 11 < 7 )); then echo true; fi > i=5 > if (( i >= 0 && i <= 10 )); then echo true; fi true > if [[ 11 -eq 11 ]]; then echo true; fi true > if (( 0 == Hello )); then echo true; fi true > if (( ++i == 6 )); then echo true; fi true > if (( ++i == 6 )); then echo true; fi מבוא לתכנות מערכות - 234122

  17. העברת פרמטרים בשורת הפקודה • כמו ב-C ניתן לגשת לפרמטרים המועברים בשורת הפקודה לתסריט • הפרמטר ה-n לתסריט נקרא פשוט n, וניתן לקרוא אותו על ידי $n • $* יוחלף ברשימת כל הארגומנטים לתסריט • אם ייתכנו רווחים בתוך הארגומנטים ניתן להשתמש ב-"$@" כדי לשמור על מספר האגומנטים הנכון • $0 יוחלף בשם התסריט • $# יוחלף במספר הארגומנטים echo_script > echo_scriptaaabbbccc command: echo_script 3 arguments parameter 1 : aaa parameter 2 : bbb parameter 3 : ccc #!/bin/bash echo command: $0 echo $# arguments let number=1 for paramin $*; do echo parameter $((number++)) : $param done מבוא לתכנות מערכות - 234122

  18. פונקציות • ניתן להגדיר ב-bash פונקציות בצורה כזו: function <name> { <commands> } • פונקציה חייבת להכיל לפחות פקודה אחת • השימוש בפונקציה יכול להתבצע רק אחרי הגדרתה • אפשר להעביר לפונקציה ארגומנטים • הפונקציה משתמשת בהם בדומה לשימושבארגומנטים המועברים לתסריט • הפונקציה אינה יכולה לגשת לארגומנטיםשל התסריט שקרא לה מבוא לתכנות מערכות - 234122

  19. פונקציות • כדי ליצור משתנה מקומי בפונקציה יש להכריז עליו תחילה עם local: > using_local original_aoriginal_b original_asurprise_b using_local #!/bin/bash function surprise { local a=surprise_a b=surprise_b } a=original_a b=original_b echo $a $b surprise echo $a $b מבוא לתכנות מערכות - 234122

  20. פונקציות • ניתן "להחזיר" ערכים מפונקציה בעזרת command subsitution (backticks): > sum_numbers1 2 3 4 5 15 sum_numbers #!/bin/bash function sum { local result=0 for num in $*; do let result+=$num done echo $result } n=`sum $*` echo $n ביטוי זה יוחלף בסכום הרצוי מבוא לתכנות מערכות - 234122

  21. קריאת קלט • ניתן לקרוא שורה מהקלט הסטנדרטי על ידי read <flags> <variable name> • השורה תיקלט לתוך שם המשתנה שהוגדר • הדגל -a יחלק את השורה לפי מילים לתוך מערך • הביטוי read יוחלףעל ידי bash בשורת קלט שתיקלט מהקלט הסטנדרטי > read line Hello world > echo $line Hello world > read -a line Hello world > echo $line Hello > echo ${line[*]} Hello world מבוא לתכנות מערכות - 234122

  22. עבודה עם קבצים • דרך פשוטה לקריאת קובץ היא על ידי שימוש בהפניית קלט ושימוש ב-read: • דרך פשוטה לקרוא קובץ שורה אחר שורה היא כך: > cat hello.txt Hello world! > read line < hello.txt > echo $line Hello world! > cat lines.txt first line second line > lines_counter lines.txt first line second line 2 #!/bin/bash counter=0 while read line; doecho $line let counter++ done < "$1" echo $counter lines_counter מבוא לתכנות מערכות - 234122

  23. חלוקה פונקציונלית של תסריטים • שימו לב שניתן להשתמש ב-bash כדי לערבב תסריטים עם תכניות שנכתבו בשפות שונות בקלות • מכאן מגיע כוחן של שפות תסריטים - scripting languages • ניתן להעביר פרמטרים לתסריטי עזר • בעזרת פרמטרים בשרות הפקודה • בעזרת pipeline • בעזרת קבצים זמניים • ניתן לקבל ערכים חזרה מתסריטי עזר • בעזרת פלט מתסריט העזר מבוא לתכנות מערכות - 234122

  24. העברת והחזרת ערכים • החזרת ערכים מתסריטי העזר יכולה להתבצע בעזרת • שימוש ב-backticks result=`helper_script` • העברה לתסריט אחר ב-pipeline helper_script | another_script • דרך קובץ זמני helper_script > temp • העברת פרמטרים לתסריטי עזר יכולה להתבצע בדרכים הבאות • בשורת הפקודה helper_script $arg1 $arg2 • בעזרת pipeline echo $arg1 $arg2 | helper_script • דרך קובץ זמני echo $arg1 $arg2 > temp helper_script < temp מבוא לתכנות מערכות - 234122

  25. exit • ניתן להשתמש בפקודה exit על מנת לצאת מה-shell הנוכחי ולהחזיר ערך יציאה נבחר: exit [status] • ערך בררת המחדל הוא 0 – ומייצג "הצלחה" של התוכנית. כל ערך אחר (מספר שלם) אמור לייצג כישלון. • בכל רגע נתון ערך היציאה האחרון שמור במשתנה $? example_script >./example_script hi > echo $? 1 > echo $? 0 #!/bin/bash echo"hi" exit1 echo"bye" מבוא לתכנות מערכות - 234122

  26. דוגמה • כתבו תסריט בשם search אשר מקבל מחרוזת ושמות קבצים ומדפיס את כל השורות המופיעות בקבצים הללו המכילות את המחרוזת המבוקשת • אם מתקבל שם תיקיה, ייבדקו כל הקבצים תחת התיקיה הזו רקורסיבית > search Blue scene35.txt scene35.txt : 37 : LAUNCELOT: Blue. scene35.txt : 55 : GALAHAD: Blue. No yel-- Auuuuuuuugh! > search swallow scene*.txt scene1.txt : 50 : GUARD #1: But then of course African swallows are not migratory. scene1.txt : 54 : GUARD #2: Wait a minute -- supposing two swallows carried it together? scene35.txt : 63 : BEDEMIR: How do know so much about swallows? > search cow farms farms/animals/animals.txt : 8 : cow farms/farm1.txt : 2 : cow Betsy farms/farm1.txt : 3 : slim cow Dazy farms/farm1.txt : 4 : fat cow Burger farms/farm1.txt : 5 : two cows Dartsy & Teo farms/farm2.txt : 2 : cow Leni farms/farm2.txt : 4 : cow Oreo מבוא לתכנות מערכות - 234122

  27. פתרון • נכתוב תסריט בשם search • התסריט ישתמש בפונקצית עזרהקוראת קובץ ומוצאת את השורותהמתאימות בעזרת התאמת מחרוזות search #!/bin/bash functionsearch_file { n=1 while readline; do if[[ $line = *"$1"* ]]; then echo“${2} : ${n} : $line” fi letn++; done< "$2" } forfilein ${*:2}; do if [[ -f "$file" ]]; then search_file"$1" $file fi if [[ -d "$file" ]]; then search "$1" $file/* fi done מבוא לתכנות מערכות - 234122

  28. דוגמה נוספת • נתון קובץ בשם football.txt המכיל נתונים על שערים שהובקעו במשחקי כדורגל • כל שורה בקובץ מציינת שם של שחקן, מספר השערים שהבקיע במשחקשנערך בתאריך מסוים, שם הקבוצהבה הוא שיחק ושם הקבוצה היריבה • ברצוננו לכתוב תסריט בשם player אשר יקבל כפרמטר שם של שחקןוידפיס את כל השורות עבורומהקובץ football.txt ואת סכוםמספר השערים שהבקיע football.txt AlonMiz. 2 23/10/93 Macabi-Haifa Macabi-Tel-Aviv IzakZoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer-Sheva Ronen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-AvivReuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-Aviv EyalBer. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv IzakZoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Haifa AlonMiz. 2 26/10/93 Macabi-Haifa Beitar-Jerusalem IzakZoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-Hiafa AlonMiz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikva Ronen Ha. 3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa > player "AlonMiz." AlonMiz. 2 23/10/93 Macabi-Haifa Macabi-Tel-Aviv AlonMiz. 2 26/10/93 Macabi-Haifa Beitar-Jerusalem AlonMiz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikva Total number of goals: 6 מבוא לתכנות מערכות - 234122

  29. פתרון • נשתמש בתסריט search שכתבנומקודם כדי לקבל רק את השורותהרלוונטיות • נכתוב פונקצית עזר בשם calc_totalאשר תקרא את השורות מהקלטהסטנדרטי שלה ותסכום את מספרהגולים של השחקן תוך כדי הדפסתן player #!/bin/bash functioncalc_total { sum=0 whileread -a line; do letsum+=${line[6]} echo ${line[*]:4} done echo "total number of goals: $sum" } search "$1" football.txt | calc_total מבוא לתכנות מערכות - 234122

  30. דוגמה שלישית • כתבו תסריט לדירוג שחקנים בשם best_player אשר יקבל רשימה של שמות שחקנים בשורת הפקודה וידפיס את שם השחקן שהבקיע את מרב הגולים • אם קיימים מספר שחקנים שהבקיעו את מרב הגולים יודפסו שמות כל השחקנים • לכל שחקן יש להדפיס את שמו ומספר הגולים שהבקיע > best_player "AlonMiz." "IzakZoh." "Ronen Ha." "ReuvenA." AlonMiz. 6 Ronen Ha. 6 מבוא לתכנות מערכות - 234122

  31. פתרון max_goals=0 forplayerin "$@"; do goals=`sum_player_goals "$player"` if (( goals > max_goals )); then max_goals=$goals fi done forplayerin "$@"; do goals=`sum_player_goals "$player"` if (( goals >= max_goals )); then echo "$player" $max_goals fi done #!/bin/bash # Sums the goals from lines in #the correct format functionsum_goals { localsum=0 whileread -a line; do letsum+=${line[6]} done echo $sum } # Sums all the goals of target player functionsum_player_goals { ./search "$1" football.txt | sum_goals } best_player מבוא לתכנות מערכות - 234122

  32. השוואה בין bash ל-C • Bash היא שפת תסריטים - scripting language • שפות תסריטים נוספות: Perl, Tcl, Python, Ruby. • C היא שפת תכנות מערכת -system programming language • שפות מערכת נוספות: C++, Java, C#. מבוא לתכנות מערכות - 234122

  33. השוואה בין bash ל-C • יתרונותשל bash על C: • עבודה נוחה עם מחרוזות ומשתנים • נוח "להדביק" תכניות קיימות (עוד על כך בתרגול 7) • קוד קצרמשמעותית לחלק מהמשימות • אין קומפיילר - לא צריך להכריז על דברים • חסרונותשל bash לעומת C: • אין קומפיילר - אין בדיקותמאפשר באגים מסוכנים • איטית(לעתים פי כמה מאות) • נבחר ב- bash עבור מטלות פשוטות וקצרות שזמן הביצוע שלהן לא קריטי read deposits account_balance=100 for d in ${deposits[*]}; do acount_balance=$((account_balance + d)) done echo $account_balance מבוא לתכנות מערכות - 234122

  34. bash- סיכום • כדי לחסוך ביצוע חוזר וידני של פעולות ניתן ליצור תסריטים המכילים רצף פקודות שימושי ולהריצם בעזרת source או הפיכתם לקובץ הרצה • ב-bash קיימים מבני הבקרה while , for ו if המאפשרים כתיבת קוד מתקדם בתסריטים • ניתן לגשת לפרמטרים לשרות הפקודה של תסריט בדומה לתכנית ב-C • כדי לקרוא מהקלט הסטנדרטי ב-bash נשתמש בפקודה read • ניתן לחלק תסריטים לפונקציות ולהעביר מידע ביניהן ע"י קריאת טקסט בפונקציה וכתיבתו לפלט • נוח להדביק תסריטים ביחד בעזרת pipeline ו-command substitution כדי לפתור בקלות בעיות • נשתמש ב-bash עבור מטלות פשוטות שאינן דורשות חישובים רבים, עבור שאר המטלות נמשיך להשתמש ב-C מבוא לתכנות מערכות - 234122

  35. בקרת תהליכים ב-UNIX הרצה בחזית וברקע פקודות לניהול תהליכים מבוא לתכנות מערכות - 234122

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

  37. הרצה בחזית וברקע • Shell יחיד יכול להריץ מספר תהליכים בו זמנית • כל התהליכים מדפיסים את הפלט שלהם לערוצי הפלט הסטנדרטיים • רק תהליך אחד יכול להשתמש בערוץ הקלט הסטנדרטי • תהליך אשר מקושר לערוץ הקלט הסטנדרטי רץ בחזית • כדי להריץ תהליך בחזית יש להפעילו כרגיל > command • כל עוד תהליך רץ בחזית אין גישה ל-prompt ולא ניתן להכניס פקודות חדשות • תהליכים שאינם מקושרים לקלט הסטנדרטי רצים ברקע • ניתן להריץ תהליך ברקע על ידי הוספת & לסוף הפקודה > command & • תהליך יכול להיות גם מושהה, במצב זה התהליך אינו רץ אך מצבו נשמר בזיכרון ונוכל להמשיך את הרצתו כשנרצה מבוא לתכנות מערכות - 234122

  38. בדיקת מצב תהליכים • הפקודה jobs מדפיסה את רשימת התהליכים המורצים תחת ה-Shell > jobs • לכל תהליך מוצג מספר מזהה, מצבו ושם הפקודה • סימן ה-+ מייצג את התהליך "הנוכחי" • תהליך זה יהווה את ברירת המחדל לפקודות טיפול בתהליכים • סימן ה-- מייצג את התהליך הבא בתור להיות + כאשר מספר תהליכים מוציאים פלט בו זמנית הטרמינל מתבלגן במהירות > ./loop 1 & [1] 3692 > Loop 1! ./loop 2 & [2] 3711 Loop 2! Loop 1! loop #!/bin/bash while [[ true ]]; do sleep 1 echo Loop $1! done המספר בסוגריים המרובעים הוא מספר התהליך תחת ה-Shell מבוא לתכנות מערכות - 234122

  39. שליחת אותות לתהליך בחזית • כדי לשנות את מצב הריצה של התהליך הרץ בחזית ניתן לשלוח אותות בעזרת קיצורים מהמקלדת • Ctrl+C: הורג (מפסיק) את התהליך אשר בחזית • Ctrl+Z: משהה את התהליך אשר בחזית • התהליך מפסיק לרוץ אך מצבו נשמר מבוא לתכנות מערכות - 234122

  40. פקודות לניהול תהליכים • ניתן להחזיר תהליך לריצה בחזית בעזרת fg > fg [process] • ניתן להחזיר תהליך לריצה ברקע בעזרת bg > bg [process] • ניתן להשהות תהליך על ידי suspend > suspend <process> • ניתן להרוג תהליך על ידי הפקודה kill > kill <process> • ניתן לציין מספר תהליך ע"י % • ניתן להריץ את התהליך ששמו מתחיל ב-<str> ע"י %<str> • אם קיימים שני תהליכים מתאימים הפקודה תיכשל • עבור fg ו-bg: אם לא צוין מספר תהליך יוחזר התהליך שמסומן ב-+ מבוא לתכנות מערכות - 234122

  41. בקרת תהליכים ב-Unix - סיכום Ctrl+Z ריצה בחזית מושהה הרצה רגילה fg Ctrl+C bg kill suspend fg ריצה ברקע מופסק הרצה עם & kill מבוא לתכנות מערכות - 234122

  42. שאלות ממבחנים - bash שימוש בתכניות סטנדרטיות של Unix בתסריטים מבוא לתכנות מערכות - 234122

  43. שאלה 1 (21.7.95) • כתוב תכנית ב-bash ששמהarrangeאשר מעבירה קבצים מהתיקיה הנוכחית (שאינם תיקיות) לתוך תתי-תיקיות לפי הכללים הבאים: • לכל קובץ שאינו תיקיה: • אם קיימת תת-תיקיה לתיקיה הנוכחית ששמו זהה ל-4 האותיות הראשונות בשם הקובץ, הקובץ יועבר לתוך התיקיה. (שים לב שהכוונה להעברתהקובץ ולא להעתקתו). • אם תנאי 1 לא מתקיים, וקיימים לפחות שני קבצים נוספים בתיקיה הנוכחית שאינם תיקיות, כך ש-4 האותיות הראשונות בשמם זהות ל-4 האותיות הראשונות בשם הקובץ, התוכנית תיצור תת-תיקיה חדשה ששמה זהה ל-4 האותיות הראשונות בשם הקובץ, והקובץ יועבר לתוך תת-תיקיה זו. מבוא לתכנות מערכות - 234122

  44. שאלה 1 (21.7.95) - דוגמה • במדריך הנוכחי קיימים הקבצים הבאים: file1 file2 file3 prog1 prog2 prog script1 script2 כאשר רק הקובץ prog הינו תיקיה • לאחר הפעלת התוכנית arrangeבתיקיה הנוכחית, יהיו הקבצים הבאים בתיקיה זו: file script1 script2 prog כאשר: • file ו – prog הינם תיקיות • בתיקיה fileיהיו הקבציםfile1 file2 file3 • בתיקיה progיהיו הקבציםprog1ו - prog2 (בנוסףלקבצים שהיו בתוכו לפניהפעלת התוכנית arrange). file script1 script2 prog file1 file2 file3 prog1 prog2 file1 file2 file3 script1 script2 prog prog1 prog2 מבוא לתכנות מערכות - 234122

  45. פתרון #!/bin/bash functionfiles { forf in `ls`; do if[[ -f $f]]; then echo $f fi done } functionfileCount { line=( `files | cut -c1-4 | sort | uniq -c | grep $1` ) echo ${line[0]} } functionmakeDir { if[[ ! -d $1 ]] ; then mkdir $1 fi } arrange מבוא לתכנות מערכות - 234122

  46. פתרון arrange forfile in `ls` ;do if[[ ! -f $file]] ; then continue fi dir="`echo $file | cut -c1-4`" dirsNum=`fileCount "$dir"` if (( dirsNum> 2 )) ; then makeDir $dir fi if [[ -d $dir ]] ; then mv $file $dir fi done מבוא לתכנות מערכות - 234122

  47. שאלה 2 (מועד ג', אביב 2006) • חברת Moogle, שהחליטה זה מכבר לפתוח סניף בחיפה, הכריזה על יום ראיונות בפקולטהלמדעי המחשב בטכניון (אשר בהם יכולים להשתתף רק בוגרי קורס מת"ם כמובן). • במהלך הראיונות נוכחים מספר מראיינים ובינהם גם מנהל Moogle. • כל מראיין נותן ציון למרואיין בין 0 ל-100. • הציון הסופי יקבע ע"י שקלול כל הציונים. • למנהל יש זכות וטו ולא יתכן כי יתקבל לעבודה מרואיין שהמנהל החליט לא לקבל. • בסיום הראיונות כל מראיין מכין קובץ בפורמט הבא על האנשים אותם הוא ראיין: <ID> <FULL NAME> <GRADE> • השדות מופרדים זה מזה בטאבים. שם הקובץ הינו <interviewer name>.grades. • דוגמה לקובץ בשם eyal.grades: • הקובץ של מנהל Moogle ייקראMoogle.grades ויכול להיראות כך: 031243129 Moshe Levi 60 444422267 Shimon Cohen 90 555782311 David David 100 031243129 Moshe Levi 57 555782311 David David -NO- 444422267 Shimon Cohen 80 מבוא לתכנות מערכות - 234122

  48. שאלה 2 (מועד ג', אביב 2006) • עליכם לכתוב תסריט בשם BestToWork אשר ינתח את הקבצים הללו ויחזיראת קבוצת המרואיינים הטובים ביותר. התסריט יקבל כפרמטר את מס' מקומות העבודה הפנויים ויחזיר מס' שכזה של מרואיינים מצטיינים ממויינים לפי מידת ההצלחה. • במקרה שאין מספיק מרואיינים שהתראיינו / עברו את הראיון, תוחזר ההודעה: "not enough interviewees” • לדוגמה, עבור שני הקבצים שבדוגמה: • הערות: • הניחו כי קבצי הקלט קיימים ותקינים • ניתן להניח שאותם מראיינים ראיינו את כל האנשים • אין להשתמש בקבצים זמניים • ניתן להשתמש במספר לא מוגבל של תסריטים > BestToWork 2 1) 444422267 Shimon Cohen 2) 031243129 Moshe Levi > BestToWork 3 not enough interviewees מבוא לתכנות מערכות - 234122

  49. פתרון BestToWork #!/bin/bash functionPrintBest { local num=1 whileread-aline; do echo"${num}) ${line[0]} ${line[1]} ${line[2]}" letnum++ done } functionCalcOneGrade { local total_grade=0 whileread-a line; do lettotal_grade+=${line[3]} done echo$total_grade } מבוא לתכנות מערכות - 234122

  50. פתרון functionCalcGrades { whileread-aline; do grade=`cat *.grades | grep ${line[0]} | CalcOneGrade` #$line[0] is ID, $line[1] is the first # name, $line[2] is the last name echo${line[0]} ${line[1]} ${line[2]} $grade done } if (( `catMoogle.grades | grep -v"\-NO\-" | wc -l` < $1 )) ; then echo"not enough interviewees" else catMoogle.grades | grep -v"\-NO\-" | CalcGrades | \ sort -nrk3 | PrintBest | head -$1 fi BestToWork מבוא לתכנות מערכות - 234122

More Related