קובץ PID קיים, אין מנהרה: האם OpenVPN אי פעם רץ?
קובץ PID שנשאר לא אומר דבר על כך אם מנהרה פעילה. בדקו את השירות, את שעת ההתחלה של התהליך ואת החוזה של המשגר לפני שמוחקים אותו.
כאשר המשגר מסרב להפעיל את OpenVPN מפני שקובץ PID כבר קיים, הקריאה הטבעית היא שמנהרה פועלת במקום כלשהו. קריאה זו שגויה לעיתים קרובות מספיק כדי שיהיה שווה לבדוק אותה לפני שמוחקים משהו. קובץ בתיקיית ריצה הוא הנהלת חשבונות, והנהלת חשבונות שורדת קריסות, אתחולים וכיבויים שהופרעו ולא השאירו תהליך מאחור. שתי שאלות מכריעות את המקרה: האם יש תהליך חי, והאם התהליך הזה שייך למופע הזה.
התחילו בשירות, לא בקובץ
הסירוב מגיע בדרך כלל ממשגר ולא מ-OpenVPN עצמו. הוא קורא נתיב, מוצא שם משהו ועוצר לפני שהוא מנתח תצורה. השאלה הראשונה היא אפוא על החוזה של המשגר, לא על המנהרה.
קראו את היחידה או הסקריפט שהדפיס את ההודעה וציינו שלושה דברים: הנתיב שהוא בודק, סוג השירות שהוא מצהיר עליו, והאם הוא אחראי בכלל לכתיבת הקובץ. יחידה מודרנית עשויה להשתמש בפיקוח פשוט או בפיקוח התראה ולא לגעת בקובץ PID לעולם, בעוד שסקריפט init ישן יותר עשוי ליצור אחד בעצמו. העתקת בדיקה מדגם אחד לאחר מייצרת בדיוק סירוב מסוג זה. בררו איזה דגם בשימוש לפני שאתם מפרשים משהו.
רק אז השאלה הופכת להיות האם מופע באמת פועל.
בדקו אם המזהה הזה שייך למופע שלכם
מספר בקובץ מוכיח שמספר נכתב. הוא אינו מוכיח שתהליך עם המזהה הזה קיים כעת, ובוודאי אינו מוכיח שהתהליך הוא שלכם, מפני שמזהים נעשים בהם שימוש חוזר לאחר אתחול.
השוו את שעת ההתחלה של התהליך לחותמת הזמן של הקובץ, את הקובץ הניתן להרצה לפקודה של היחידה, ואת החברות בשירות לשם היחידה. אי-התאמה בכל אחד מהשלושה פירושה שאתם מסתכלים על הנהלת חשבונות ולא על מנהרה.
במארח שמריץ מכולות או כמה מרחבי שמות, מזהה עשוי להיות משמעותי בתצוגה אחת וחסר באחרת. אי-ראיית תהליך גם אינה הוכחה שהוא אינו קיים, אם החשבון שלכם אינו יכול לבדוק אותו. בדקו מההקשר שבו משתמש המשגר לפני שאתם מסיקים מסקנות.
systemctl status [email protected]
ps -o pid,lstart,args -p "$(cat /run/openvpn/vpn.pid)"מה המשגר הבטיח לעשות עם הקובץ
PIDFile= אומר למנהל השירותים היכן לקרוא את המזהה של התהליך הראשי. המנהל אינו כותב את הקובץ הזה, אבל הוא מסיר קובץ ששרד לאחר כיבוי, וזו בדיוק הסיבה שיציאה שהופרעה יכולה להשאיר קובץ.
חלוקת האחריות הזו מסבירה שני תסמינים שאנשים מדווחים עליהם כבאגים. קובץ שלעולם אינו מופיע פירושו שהדמון או הסקריפט שלו לא הצליחו לכתוב אותו, ולא שהפיקוח מוגדר שגוי. קובץ ששורד עצירה פירושו שמסלול הכיבוי מעולם לא הושלם.
זה גם מסביר מדוע ההנחיות העכשוויות מציעות להימנע מהמוסכמה כאשר הפיקוח יכול לעקוב אחר התהליך הראשי ישירות. ההנחיות האלה אינן הרשאה לשנות את הסוג של יחידה ארוזה, מפני שההתנהגות של הדמון בחזית, בהסתעפות או בהתראה חייבת להתאים למה שהיחידה מצהירה. שנו את הסוג בלי לשנות את הדמון, ואז תקבלו יחידה שמדווחת על כשל בזמן שהמנהרה פועלת, או ההפך. התאימו את הזוג, או השאירו את שניהם. מדריך השירות של systemd מתאר את חלוקת הבעלות.
כיבוי נקי לעומת יציאה שהופרעה
עצירה נקייה מבקשת מהדמון לצאת, ממתינה לו ומאפשרת למנהל לסדר את הנהלת החשבונות שלו. יציאה שהופרעה, תהליך שנהרג או אתחול באמצע כיבוי מדלגים על חלקים מהרצף הזה, והקובץ הוא מה שנשאר. מציאה של אחד לאחר קריסה אומרת לכם שהכיבוי לא הסתיים, ולא שמשהו מאזין.
השוו את חותמת הזמן של הקובץ לאתחול האחרון ולעצירה האחרונה של היחידה.
אחר כך בדקו את הראיות החיות ישירות. שקע שמקושר ליציאת ה-VPN וממשק מנהרה עם כתובת הם הוכחה שמשהו פועל, באופן שקובץ טקסט בתיקיית ריצה לעולם אינו. אם שניהם חסרים, שום דבר אינו פועל, יהיה אשר יאמר הקובץ.
הפסיקו למחוק את הקובץ מתוך הרגל
מחיקתו היא צעד שחזור לגיטימי לאחר שקבעתם שאין מופע שמחזיק בו ושהמשגר מתעד את ההתנהגות הזו.
כהרגל קבוע לפני הפעלה, הוא מנטרל את הבדיקה שאתם עוקפים. אם קבצים ישנים חוזרים אחרי כל עצירה נקייה, הכותב ומחזור החיים של הכיבוי אינם מסכימים מי מחזיק בנתיב, ואי-ההסכמה הזו היא הבאג שראוי לתקן.
שמרו על דרך עצמאית אל המארח, הפעילו מופע אחד דרך המנהל הרגיל שלו וקראו את התוצאה הראשונה. האדם הבא מקבל יחידה שעובדת או שמסבירה את עצמה.