לולאת ההמתנה שלנו חיכתה 35 שעות לעצמה: pgrep -f ו-pkill -f דרך SSH
תפעול
ב-31 באוקטובר התחלנו לולאה קטנה דרך SSH: לחכות עד שמונת תרגום במכונה אחרת תסתיים, ואז להריץ משימת המשך. משימת התרגום הסתיימה באותו לילה. כשבדקנו שוב יומיים לאחר מכן, הלולאה חיכתה כבר 35 שעות, ומשימת ההמשך מעולם לא הורצה.
מה הלולאה הייתה
ssh build-host 'while pgrep -f "i18n_job.py example.com" >/dev/null; do sleep 30; done; ./follow-up.sh'
pgrep -f מתאים תבנית לשורת הפקודה המלאה של כל תהליך. SSH מריץ את הפקודה המצוטטת כ-bash -c 'while pgrep -f "i18n_job.py example.com" …', ושורת הפקודה הזו מכילה את התבנית. pgrep משאיר את התהליך שלו עצמו מחוץ לתוצאות, אבל לא את המעטפת (shell) שהפעילה אותו. לכן, כל עוד הלולאה הייתה חיה, היא מצאה התאמה: את עצמה.
התאום שלה: pkill -f הורג את המעטפת שבה הוא רץ
אותו דבר קורה עם pkill -f, עם תוצאות גרועות יותר:
ssh build-host 'pkill -f "worker.py --queue a"; nohup python3 worker.py --queue a &'
שורת הפקודה של המעטפת עצמה מכילה את התבנית, ולכן pkill הורג את המעטפת. העובד (worker) נעצר ולא מופעל שוב, ו-SSH יוצא עם קוד 255 בלי הודעת שגיאה. זה נראה כמו בעיית ציטוט, וזה מה שחשבנו בהתחלה.
בין ספטמבר לסוף אוקטובר נכנסנו לאחת מהן לפחות תריסר פעמים: הפעלות מחדש שלא קרו, לולאה שהחזיקה בדיקה במשך שלוש שעות וחצי, אחרת שהחזיקה תור תרגום במשך 50 דקות, וזו.
מה אנחנו עושים עכשיו
- סוגריים מרובעים בתבנית:
pgrep -f "[i]18n_job.py example.com". כתבנית רגולרית,[i]תואם את האות i, ולכן המשימה עדיין תואמת; שורת הפקודה של המעטפת מכילה את התווים[i], שהביטוי לא תואם אותם. זה עוזר רק אם התבנית הפשוטה לא מופיעה בשום מקום אחר באותה שורה: פקודת הפעלה מחדש בהמשך אותה שורה תתאים שוב. - לאתר, לעצור ולהפעיל בקריאות SSH נפרדות. קריאה אחת מפרטת את התהליכים עם
pgrep -af, הבאה הורגת את מזהי התהליכים (PIDs) שהיא הדפיסה, והשלישית מפעילה את התהליך החדש. - לחכות על PID, לא על תבנית:
tail --pid=1234 -f /dev/null, אוwhile kill -0 1234; do sleep 30; done. - עדיף לתת ל־systemd לנהל את המשימה. הריצו כיחידה ובדקו עם
systemctl is-active, או הריצו עםsystemd-run --wait. אין כאן תבנית שעלולה להיכשל. - כל המתלה מקבלה מועד סיום (
timeout 3h) ומציינת מתי היא מוותרת. לולאה ללא מועד סיום נכשלת בשקט.
Factory Floor, ערכת האוטומציה שמריצה את המכונות שלנו, פועלת באמצעות יחידות systemd: היא לעולם לא מחפשת תהליך לפי שורת הפקודה שלו. הלולאות שהכשילו אותנו היו אלו שהקלדנו ידנית.