לולאת ההמתנה שלנו חיכתה 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 דקות, וזו.

מה אנחנו עושים עכשיו

Factory Floor, ערכת האוטומציה שמריצה את המכונות שלנו, פועלת באמצעות יחידות systemd: היא לעולם לא מחפשת תהליך לפי שורת הפקודה שלו. הלולאות שהכשילו אותנו היו אלו שהקלדנו ידנית.

עודכן: