גולש ברשת הארצית נתקלתי בא כתבה מעניינת (שאני מביא כאן טקסטואלית כי זה מוסבר בצורה מופתית) שבו המחבר שלו מראה לנו כיצד להפוך את סקריפטים ה- 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. אתה יכול ללמוד קצת יותר על מלכודות עם זה מדריך מצוין.
גדול! תודה על השיתוף.
מאמר נחמד, פשוט שנה 'הד "rsync כבר פועל: $ (cat $ LCK)"' ל 'echo' rsync כבר פועל: $ (cat $ LOCK) "'
לגבי
מאמר מעניין מאוד, כן אדוני! את זה אני שומר.
זו פקודה מאוד שימושית שיש לזכור. השתמשתי בו בתסריט שפרסמתי בפוסט, כדי למחוק כמה קבצים שהתסריט יצר כשהוא נעצר.
מעניין מאוד, כן אדוני.