פרסום המקור: . תרגום ובדיקה טכנית: .
שירות Windows שמתחיל לאט עלול לחרוג מזמן ההמתנה של מנהל השירותים, SCM — Service Control Manager. הארכת ההמתנה יכולה לעזור במקרים מסוימים, אבל אינה מאיצה את השירות ואינה מתקנת שירות שנתקע. לפני השינוי בדקו ביומן האירועים מה נכשל, והאם יש בעיית תלות, הרשאות או משאב חסר.
מסלול ראשון: הגדרת זמן ההמתנה במערכת
זהו שינוי ברישום המערכת, Registry, עם השפעה ברמת המחשב, ולא הגדרה של שירות בודד. בצעו אותו רק בהרשאה ובחלון תחזוקה. צרו גיבוי של המפתח הרלוונטי ורשמו את הערך הקיים, או את העובדה שהערך לא היה קיים, כדי שתוכלו לשחזר את המצב הקודם.
- פתחו את עורך הרישום, regedit, בהרשאות מנהל וגשו אל:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control - חפשו את הערך ServicesPipeTimeout. אם אינו קיים, צרו ערך מסוג DWORD (32-bit) בשם הזה.
- בחרו בסיס עשרוני. בדוגמת Microsoft מגדירים 60000, כלומר 60 שניות. היחידה היא אלפית השנייה. אל תקטינו ערך קיים גבוה יותר רק כדי להתאים לדוגמה; בחרו הגדלה מתונה שמתאימה לבעיה שנבדקת.
- אתחלו את המחשב בזמן מתוכנן, ולאחר מכן בדקו את מצב השירות ואת יומן האירועים.
המסמך של Microsoft מתייחס, בין היתר, לאירועי זמן קצוב 7000 ו־7011, וממליץ לחקור את הבעיה המקורית גם אם ההגדלה עזרה. אל תמשיכו להגדיל את הערך ללא גבול במקום לאבחן את הסיבה.
מסלול שני: בקשת זמן נוסף מתוך קוד השירות
אם אתם מתחזקים שירות המבוסס על ServiceBase ב־.NET Framework, אפשר לבקש זמן נוסף במהלך פעולת האתחול. זו דוגמה חלקית למתודה בתוך מחלקת השירות, לא פקודה שמריצים כדי לתקן תוכנה אחרת:
protected override void OnStart(string[] args)
{
RequestAdditionalTime(50000);
// כאן מתבצע המשך אתחול השירות
}
50000 פירושו 50 שניות. המתודה RequestAdditionalTime מעבירה למנהל השירותים רמז לזמן ההמתנה הנדרש לפעולה שנמצאת במצב ממתין. היא מיועדת להיקרא מתוך פעולות שירות מתאימות, כגון OnStart; קריאה כשאין פעולה במצב ממתין עלולה להיכשל.
אין לבלבל בין שני המסלולים: הראשון משנה הגדרה ברמת המערכת; השני הוא חלק ממימוש השירות עצמו. אף אחד מהם אינו מבטיח שהשירות יסיים לאתחל בהצלחה.
מקורות לבדיקה: Microsoft Learn — תיעוד 1; Microsoft Learn — תיעוד 2