מלכודות: הפוך את התסריטים הבסיים שלך לחזקים יותר

גולש ברשת הארצית נתקלתי בא כתבה מעניינת (שאני מביא כאן טקסטואלית כי זה מוסבר בצורה מופתית) שבו המחבר שלו מראה לנו כיצד להפוך את סקריפטים ה- Bash שלנו לחזקים יותר באמצעות מלכודות.

הפוך את קובצי ה- bash שלך לחזקים יותר בעזרת מלכודות

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

מלכודות היא דרך פשוטה ויעילה לשלוט בפלט של סקריפטים bash. נחזור לאותה סיטואציה התחלתית, אם הסקריפט נעצר ידנית, למשל עם ctrl-c, הוא מופרע בהחזרת אות הפלט

INT

ואם זה מסתיים ב

kill

ואז הפלט יהיה

TERM.

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

kill -l

עם זאת השימושים ביותר הם במדויק

INT, TERM, יציאה

אם התסריט מורכב, למשל, מסנכרון קבצים עם

rsync

הדבר ההגיוני ביותר הוא להסתמך על קובץ נעילה שאינו מאפשר לסקריפט לפעול בו זמנית:

LOCK = "/ var / run / rsync.lock" אם [! -e $ LOCK]; ואז גע ב $ LOCK rsync -avz foo bar rm $ LOCK אחר הד "rsync כבר פועל" fi

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

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

LOCK = "/ var / run / rsync.lock" אם [! -e $ LOCK]; ואז מלכודת "rm -f $ LOCK; יציאה" INT TERM EXIT גע $ LOCK rsync -avz foo bar rm $ LOCK מלכודת - INT TERM EXIT אחרת הד "rsync כבר פועל" fi

המיוחד בפתרון זה הוא שהפקודה כלואה במלכודת, כך שכאשר מתקבל אות

INT, TERM, יציאה

הסקריפט נעצר ומנקה את קובץ הנעילה.

ראוי לומר שיכולה להיות מצב תחרות בתסריט שלמעלה בין אימות קובץ הנעילה למועד יצירתו. פתרון אפשרי אחד יהיה להשתמש בהפניה מחדש ובמצב noclobber של bash שאינו מפנה לקובץ קיים:

LOCK = "/ var / run / rsync.lock" if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; ואז לכוד 'rm -f "$ LOCK"; לצאת $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK מלכודת - INT TERM EXIT אחר הד "rsync כבר פועל: $ (cat $ LCK)" fi

המוזרות של האחרון היא בכך שהוא משמש כפי שכבר אמרתי, מצב noclobber וכי קובץ הנעילה מכיל את ה- PID של התהליך שמבוצע.

ראוי להזכיר גם שישנם פתרונות אחרים כגון

flock

o

solo

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


השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.

  1.   רפאל קסטרו דיג'ו

    גדול! תודה על השיתוף.

  2.   nx דיג'ו

    מאמר נחמד, פשוט שנה 'הד "rsync כבר פועל: $ (cat $ LCK)"' ל 'echo' rsync כבר פועל: $ (cat $ LOCK) "'

    לגבי

  3.   דגלאנגוס דיג'ו

    מאמר מעניין מאוד, כן אדוני! את זה אני שומר.

  4.   חואקין דיג'ו

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

  5.   DaniFP דיג'ו

    מעניין מאוד, כן אדוני.