לדלג לתוכן

Lesson 08: Terminal, launchd & Background Processes - Instructor Reference (Asset A)

1. מבוא לטרמינל (Terminal)

1. High-Level Theory & History

ממשק שורת הפקודה (CLI), המיוצג ב-macOS על ידי אפליקציית ה-Terminal, הוא שער הגישה הישיר ביותר לליבת המערכת (Darwin). בעוד שהממשק הגרפי (GUI) של macOS נועד להסתיר מורכבות ולספק חווית משתמש חלקה, אנשי IT ותמיכה חייבים לעקוף מעטפת זו כדי לבצע אבחון מדויק, אוטומציה וניהול מרחוק. היסטורית, הטרמינל וסקריפטים שרצים בו הגיעו לעולם המק ממערכת NeXTSTEP עם השקת Mac OS X 10.0 Cheetah בשנת 2001. המעבר ל-Zsh כמעטפת ברירת המחדל (החל מ-macOS Catalina) יישר קו עם סטנדרטים מודרניים של סקריפטים וסיפק כלי פיתוח חזקים יותר לעומת Bash הוותיק. שליטה בטרמינל היא קריטית משום שכלי MDM מריצים פקודות וסקריפטים ברמת ה-CLI תחת הרשאות Root, ולא דרך הממשק הגרפי.

2. Deep Technical Architecture

כאשר משתמש פותח את אפליקציית Terminal.app, המערכת מריצה את תהליך ה-login שקורא את קבצי התצורה של המעטפת (כגון /etc/zprofile, /etc/zshrc, ולאחר מכן את הקבצים בספריית הבית ~/.zprofile ו-~/.zshrc). הטרמינל עצמו אינו ה"מערכת", אלא רק תוכנת מעטפת (Emulator) שמתקשרת עם תהליך ה-zsh (ה-Shell). פקודות שמורצות בטרמינל מתורגמות לקריאות מערכת (System Calls) המועברות ל-Kernel (XNU). כאשר מריצים פקודות עם sudo, המערכת בודקת את הרשאות המשתמש מול קובץ /etc/sudoers (באמצעות קריאה ל-Directory Service המקומי של המק) ודורשת סיסמה או אישור Touch ID (אם הוגדר) כדי להעניק הרשאות Root זמניות לאותו תהליך בלבד.

3. Terminal Commands, Plists & Logs

  • קיצורי דרך חיוניים:

    • Ctrl + A: קפיצה לתחילת השורה.
    • Ctrl + E: קפיצה לסוף השורה.
    • Ctrl + C: ביטול (Interrupt) פקודה שרצה כרגע.
    • Ctrl + L (או הפקודה clear): ניקוי המסך.
    • Tab: השלמה אוטומטית של נתיבים או פקודות.
    • פקודות ניווט ובסיס:

    • pwd: Print Working Directory.

    • ls -la: הצגת כל הקבצים כולל קבצים נסתרים והרשאות.
    • cd ~: חזרה לספריית הבית של המשתמש.
    • הגדרות טרמינל:

    • קובץ העדפות הטרמינל: ~/Library/Preferences/com.apple.Terminal.plist

4. Edge Cases & Troubleshooting

  • בעיה: הרשאות ה-Terminal חסומות (למשל, הטרמינל מודיע Operation not permitted בעת ניסיון לגשת לתיקיית Downloads או Desktop).
    • פתרון: מנגנון ה-TCC (Transparency, Consent, and Control) חוסם את הטרמינל. יש לגשת ל-System Settings > Privacy & Security > Full Disk Access (או Files and Folders) ולוודא שלאפליקציית Terminal יש הרשאות. בארגון, ניתן לדחוף פרופיל PPPC (Privacy Preferences Policy Control) שמעניק לטרמינל (או לכלי שורת פקודה אחר) את הגישה הנדרשת מראש.
  • בעיה: תהליכים לא מגיבים ל-Ctrl + C (תהליך "זומבי" או תקוע).
    • פתרון: פתיחת חלון טרמינל חדש (Cmd + N), איתור ה-PID באמצעות top או ps -ax, וחיסול התהליך באמצעות kill -9 <PID>.

2. הלב של המערכת

1. High-Level Theory & History

מנגנון ה-launchd הוא ה"הורה" של כל התהליכים ב-macOS. הוא פותח במקור על ידי Dave Zarzycki ושוחרר לראשונה ב-2005 (Mac OS X 10.4 Tiger). הוא מחליף את מערכות האתחול הישנות של Unix (כמו init, rc, inetd, cron ועוד) לכדי תהליך ניהול אחד אחוד. הוא אחראי להפעיל את המערכת, לנהל את תהליכי הרקע, להפעיל שירותים לפי דרישה (On-Demand), ולפקח עליהם (להפעילם מחדש אם קרסו). מאחר ש-launchd היה נוקשה מדי בתזמון המשימות שלו, אפל הוסיפה בהמשך כלים כמו DAS ו-CTS לתזמון משימות גמיש (על סמך עומס מעבד וסוללה).

הבדל הליבה שכל איש IT חייב להכיר הוא ההפרדה בין LaunchDaemons (שרצים ברמת המערכת, תחת משתמש root, גם אם אף אחד לא מחובר) לבין LaunchAgents (שרצים ברמת המשתמש, עם הרשאות המשתמש, ומופעלים רק כאשר המשתמש מבצע Login).

2. Deep Technical Architecture

מיד לאחר שה-Kernel מסיים את טעינתו מתוך ה-System Volume (SSV), הוא מעביר את השליטה לתהליך launchd אשר מקבל תמיד את ה-Process ID של 1 (PID 1).

  • בשלב הראשון, launchd רץ ברמת ה-System (כ-root). הוא קורא את קבצי התצורה של ה-LaunchDaemons מתוך הנתיבים המובנים (/System/Library/LaunchDaemons) והחיצוניים (/Library/LaunchDaemons).
  • כאשר משתמש מבצע Login, תהליך ה-launchd הראשי מוליד (Spawns) עותק נוסף של launchd שרץ תחת ה-UID של אותו משתמש. תהליך משני זה קורא את ה-LaunchAgents מנתיבי המערכת וכן מהנתיב המקומי של המשתמש (~/Library/LaunchAgents). launchd משתמש במנגנון IPC (Inter-Process Communication) מסוג XPC (מונח של אפל לניהול תקשורת מאובטחת בין תהליכים) כדי לאפשר לאפליקציות לתקשר עם ה-Daemons בצורה מאובטחת.

3. Terminal Commands, Plists & Logs

  • קריאה וניהול של תהליכים (פקודת העל launchctl):

    • רשימת כל התהליכים שרצים תחת ה-launchd הנוכחי: launchctl list
    • הדפסת עץ מלא של כל השירותים והסטטוס שלהם: launchctl print system (ברמת המערכת - דורש sudo) launchctl print gui/$(id -u) (ברמת המשתמש)
    • הטענה (Load/Bootstrap) והורדה (Unload/Bootout) של תהליך: sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.plist sudo launchctl bootout system /Library/LaunchDaemons/com.example.plist
    • נתיבי קבצי התצורה:

    • /System/Library/LaunchDaemons (בליבת המערכת - SSV מוגן).

    • /Library/LaunchDaemons (לתוכנות צד שלישי).
    • ~/Library/LaunchAgents (לשירותים ברמת המשתמש הספציפי).

4. Edge Cases & Troubleshooting

  • בעיה: אפליקציה מנסה לטעון Daemon חיצוני ונכשלת שוב ושוב.
    • פתרון: החל מ-macOS Ventura, קיימת שכבת אבטחה בשם "Background Task Management" (BTM) שנועדה להתריע ולשלוט על תהליכי רקע. אם המשתמש ביטל את הפריט תחת System Settings > General > Login Items & Extensions, ה-launchd יסרב לטעון את ה-Daemon, וכל ניסיון להריץ launchctl bootstrap ייכשל עם שגיאה Service cannot load in requested session. בארגון, יש למנוע מהמשתמשים את היכולת לבטל שירותים קריטיים על ידי דחיפת פרופיל תצורה (MDM) מסוג ServiceManagement שמכריח (Forces) את אישור הפריט ומונע את כיבויו על ידי משתמש קצה.

3. אבחון עמוק

1. High-Level Theory & History

אבחון עמוק של מערכת עובדת ב-macOS דורש הבנה של שני עולמות: משאבי חומרה (ניהול זיכרון ו-CPU דרך Activity Monitor או כלי שורת פקודה) ומבנה נתונים והגדרות (קבצי Plist). ההיסטוריה של Activity Monitor החלה כתוכנות נפרדות כמו Process Viewer ו-CPU Monitor שהתאחדו ב-2003 לתוכנה אחת מקיפה. אפל משתמשת בקבצי Plist (Property List) כדי לשמור את כל הגדרה, העדפה וקובץ תצורה של אפליקציות ומערכת ההפעלה. הפורמט צמח מ-SGML העתיק, ובשנת 2002 עברה המערכת לפורמט בינארי (bplist) שמשפר את מהירות הטעינה ומונע עריכה לא מכוונת. Activity Monitor מספק מבט בזמן אמת על התנהגות המערכת, כאשר מושג המפתח "Memory Pressure" מחליף את ההסתכלות הישנה והפשטנית של "כמה זיכרון RAM נשאר פנוי".

2. Deep Technical Architecture

  • ניהול זיכרון (Memory Pressure): מערכת macOS משתמשת בטכנולוגיית Memory Compression ובמנגנון ה-Swap. כשהזיכרון הפיזי (RAM) מתחיל להתמלא, המערכת קודם כל דוחסת אותו במקום. כאשר גם הדחיסה אינה מספיקה, היא מתחילה להעביר "דפים" (Pages) שאינם בשימוש מה-RAM לכונן ה-SSD (תהליך ה-Swap). גרף ה-Memory Pressure מסכם התנהגות זו: ירוק אומר שהמערכת מתנהלת היטב. צהוב מעיד על תהליך דחיסה מסיבי ולחץ גובר. אדום משמעותו "Swap Death" – המערכת נלחמת על משאבי קלט/פלט (I/O) מול ה-SSD והביצועים יתרסקו.
  • Plist (Property Lists): קבצי ה-Plist מבוססים על מבנה XML או מקודדים בינארית לטובת חיסכון במקום ומהירות קריאה. לרוב הם מנוהלים על ידי התהליך cfprefsd (Core Foundation Preferences Daemon) שקורא וכותב אליהם במטמון. בשל השימוש במטמון (Cache), עריכה ידנית של קובץ Plist דרך עורך טקסט בזמן שהאפליקציה או התהליך רצים עשויה להידרס (Overwritten) על ידי המערכת. לכן, עורכים קבצים אלו בצורה מבוקרת או דרך הטרמינל.

3. Terminal Commands, Plists & Logs

  • ניטור משאבים בטרמינל:

    • top -u (מציג את התהליכים הצורכים הכי הרבה CPU).
    • htop או כלי ניטור פנימי של powermetrics לאבחון תרמי/ביצועים (דורש sudo).
    • עבודה עם קבצי Plist פקודת plutil:

    • סריקה ובדיקת תקינות הקובץ (מציג שגיאות Syntax אם ישנן): plutil -lint /path/to/file.plist

    • המרת קובץ בינארי ל-XML קריא (XML1): sudo plutil -convert xml1 /path/to/file.plist
    • המרת קובץ חזרה לפורמט בינארי: sudo plutil -convert binary1 /path/to/file.plist
    • קריאה מהירה של קובץ בינארי כמבנה נתונים בטרמינל: plutil -p /path/to/file.plist

4. Edge Cases & Troubleshooting

  • בעיה: עומס זיכרון קיצוני (אדום) ב-Activity Monitor, אבל ה-CPU נמוך.
    • פתרון: יש למיין את טבלת הזיכרון לפי עמודת ה-Memory, ולחפש תהליכים עם "Memory Leak" (דליפת זיכרון שבה התוכנה לא משחררת זיכרון שלא בשימוש). במקרים של תוכנות צד-שלישי או Daemons בעייתיים, ניתן להשתמש ב-kill -9 על התהליך הספציפי, או לאפס את ההעדפות (מחיקת ה-plist של האפליקציה) אם התקלה חוזרת על עצמה מיד בפתיחה.
  • בעיה: קובץ Plist נפגם לאחר עריכה (נניח בניסיון לערוך קובץ LaunchDaemon).
    • פתרון: הרצת plutil -lint תזהה בדיוק באיזו שורה ב-XML קיים הפגם (למשל סגירת תגית חסרה </dict>). תיקון התגית ושמירה. אין לעשות launchctl bootstrap עד שהקובץ עובר את בדיקת ה-lint בהצלחה.

4. תיבול ארגוני

1. High-Level Theory & History

בסביבה ארגונית, ה-Mac אינו עומד בפני עצמו – הוא מנוהל (Managed) על ידי מערכת MDM (Mobile Device Management). הליבה של קשר זה אינה מבוססת רק על התקנת "אפליקציה" של ספק ה-MDM, אלא נשענת עמוקות על היכולות המובנות במערכת ההפעלה של אפל. פרוטוקול ה-MDM שולח פקודות בפורמט XML דרך שרתי Push (APNs) אל הלקוח. בצד של המק, הרכיב המובנה שאחראי על אכיפת הפוליסות, התקנת הפרופילים, וקבלת פקודות כגון נעילה וניתוב מחדש, הוא תהליך ה-mdmclient.

2. Deep Technical Architecture

תהליך ה-mdmclient מתפקד כ-Daemon ברמת המערכת וכ-Agent ברמת המשתמש.

  • הוא מאזין לערוץ תקשורת מיוחד מול שרתי ה-APNs של Apple. כשהוא מקבל "Wake Up" דרך APNs, התהליך "מתעורר" ויוצר קשר יוצא (Outbound HTTPS) אל שרת ה-MDM הארגוני כדי לקבל פקודות (Polling).
  • הוא פועל במקביל למנוע פרופילי התצורה (profiled). כאשר מגיעה הוראה משרת ה-MDM להתקין פרופיל תצורה (Configuration Profile), mdmclient מעביר את ההוראה ל-profiled, שמחיל את השינוי במערכת ההפעלה (למשל, אכיפת הגדרת אבטחה, הוספת VPN, או הסתרת הגדרות מסוימות).
  • מרבית ספקי ה-MDM (כגון Jamf, Kandji, Intune) יפרסו בנוסף ל-mdmclient המובנה גם LaunchDaemon מקוסטם משלהם (למשל /Library/LaunchDaemons/com.jamfsoftware.task.1.daemon.plist), אשר רץ כמשתמש root ומריץ סקריפטים ופעולות מורכבות יותר ממה שפרוטוקול ה-MDM הבסיסי של אפל מאפשר.

3. Terminal Commands, Plists & Logs

  • פקודות ניהול למערכת ה-Profiles:

    • הצגת רשימת כל הפרופילים המותקנים על המחשב (רמת המערכת): sudo profiles show -type configuration
    • כפיית סנכרון מחודש מול שרת ה-MDM: sudo profiles renew -type enrollment
    • ניטור ה-MDM ב-Activity Monitor וב-Console:

    • ב-Activity Monitor, ניתן לחפש תחת שורת החיפוש mdmclient או את שם ה-Daemon של פלטפורמת ה-MDM.

    • שאיבת לוגים לאבחון בעיות סנכרון (mdmclient):

    • זרם לוגים בזמן אמת של פעילות לקוח ה-MDM (מעולה לראות מה קורה מיד כששולחים פקודה מהשרת): log stream --predicate 'process == "mdmclient"' --info

4. Edge Cases & Troubleshooting

  • בעיה: מחשב מק מופיע כ"לא מגיב" (Unresponsive) במסוף ניהול ה-MDM של ה-IT, ופקודות נתקעות במצב Pending.
    • פתרון: ראשית, יש לוודא שה-Daemon הרשמי של חברת ה-MDM עדיין רץ. ניתן לעשות זאת באמצעות Activity Monitor או launchctl print system | grep [mdm-vendor-name].
    • שנית, יש לבדוק האם המחשב מקבל הודעות Push (APNs). אם יש בעיית רשת בארגון שחוסמת פורט 5223 או את טווחי כתובות ה-IP 17.0.0.0/8, ה-mdmclient לעולם לא יקבל את הודעת ה-"Wake Up".
    • כדי לאבחן בדיוק היכן החסימה, אנשי תמיכה ישתמשו בפקודת log stream בשילוב עם mdmclient, ולאחר מכן ישלחו פקודת רענון ידנית או ישתמשו ב-sudo profiles renew -type enrollment. אם בלוגים יופיעו שגיאות של NSURLErrorDomain (כגון שגיאה 1009- או 1004-), זוהי אינדיקציה חותכת לכך שחומת האש הארגונית, או פרוקסי אגרסיבי, מיירטים את תעבורת ה-SSL של שרת ה-MDM ומונעים את החיבור.
  • בעיה: שגיאת פריסה של סוכן צד-שלישי.
    • פתרון: במידה ו-Daemon של MDM או תוכנת הגנה קורסים (Crash), ניתן לבחון האם הם מושעים (Bootout) ולהעלות אותם מחדש בעזרת launchctl bootstrap לטובת חידוש תקשורת מהיר ללא הפעלה מחדש של המערכת כולה.

Visual Aid from DeepDive: DeepDive Diagram

Tahoe UI Reference: Tahoe UI Reference

Tahoe UI Reference: Tahoe UI Reference

Tahoe UI Reference: Tahoe UI Reference

Tahoe UI Reference: Tahoe UI Reference

Tahoe UI Reference: Tahoe UI Reference

Tahoe UI Reference: Tahoe UI Reference