2010-01-04 10 views
29

कभी-कभी हमें SharePoint में छोटे प्रशासनिक कार्यों को करने की आवश्यकता होती है। एक सरल PowerShell स्क्रिप्ट इसके लिए वास्तव में एक अच्छा उपकरण है। उदाहरण के लिए, इस तरह के स्क्रिप्ट एक सूची के ईवेंट हैंडलर्स की गणना कर सकते हैं:पावरहेल में निपटान नहीं करना कितना बुरा है?)

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") 
$site = new-object Microsoft.SharePoint.SPSite($args[0]) 
$site.RootWeb.Lists["MyList"].EventReceivers > C:\MyListHandlers.txt 

यह जाना जाता है कि SPSite और SPWeb की तरह वस्तुओं एक फोन के बाद Dispose() -d होना जरूरी है अन्यथा मेमोरी लीक होते हैं। सर्वश्रेष्ठ इस स्क्रिप्ट के अंत में

$site.RootWeb.dispose() 
$site.dispose() 

पर कॉल करना होगा। लेकिन अगर यह एक पावरहेल स्क्रिप्ट है जो केवल एक बार चलाया जाएगा, और हम जानते हैं कि पावरशेल निष्पादन के बाद साफ हो जाता है - क्या यह निपटान() को कॉल करना इतना बुरा है?

तो, मेरा सवाल है - अगर कभी-कभी मैं इस तरह की स्क्रिप्ट चलाता हूं तो कुछ खतरा होता है; क्या यह शेयरपॉइंट फार्म की समग्र स्थिरता को प्रभावित करेगा (या जिस सर्वर पर मैं स्क्रिप्ट चला रहा हूं)?

+2

ग्रेट टूल लेकिन यह पर्ल की तरह गंध करता है और मुझे दूर रखता है;) –

+3

यह मेरी पहली छाप थी, लेकिन यह संकलन किए बिना किसी भी .NET क्लास के साथ काम करने की इजाजत देता है। – naivists

उत्तर

16

यह एक सुरक्षित, गैर विशिष्ट जवाब शामिल करने के लिए संपादित किया गया है:

यहां कुछ और प्रासंगिक जानकारी है।

आम में :, सब कुछ निपटाने क्योंकि निपटान नेट ढांचे के (जैसे फ़ाइल हैंडल, TCP पोर्ट, डेटाबेस कनेक्शन, आदि) बाह्य संसाधनों को मुक्त करने के तरीका है। जब तक आप निपटान() को कॉल नहीं करते हैं, तब तक संसाधनों को रिलीज़ होने की गारंटी नहीं दी जाती है। तो सावधान रहें। यह सामान्य, गैर-शेयरपॉइंट उत्तर है।

विशेष रूप से जब SharePoint संबद्ध हैं: आप PowerShell.exe प्रक्रिया को बंद करते हैं, स्मृति को मुक्त कर दिया गया है। यदि आपको स्मृति दबाव को कम करने के लिए वस्तुओं का निपटान करने की आवश्यकता है (उत्पादन वातावरण में महत्वपूर्ण है या यदि आप सभी साइटों/जाल पर लूपिंग कर रहे हैं), तो निपटान सुनिश्चित करें। यदि नहीं, तो आपको निपटान के बारे में चिंता करने की आवश्यकता नहीं है।

कारण है कि हम पहले स्थान पर निपटने के बारे में इतना पागल क्यों हैं क्योंकि अधिकांश शेयरपॉइंट कोड लंबी चल रही प्रक्रियाओं में चलाता है (या तो एएसपी.नेट कार्यकर्ता प्रक्रिया या OWSTimer.exe में) और निपटान में विफल होने से मुश्किल हो सकती है समस्या निवारण, अचानक आपदाएं (यानी, वेब सर्वर उछाल जाता है)। इन विनाशकारी प्रदर्शन मुद्दों/OutOfMemoryExceptions PowerShell में काम करते समय मुझे अधिकतर समय प्रभावित नहीं करते हैं। मैं विज्ञापन-स्क्रिप्ट चलाता हूं, मैं 3-50 एमबी रैम बर्बाद करता हूं क्योंकि मैं अपनी वस्तुओं का निपटान करने में विफल रहता हूं, मैं पावरशेल विंडो बंद करता हूं और स्मृति मुक्त हो जाती है। अधिकांश जब यह एक अनिश्चितता है।

मैंने शेयरपॉइंट के साथ काम करने के लिए स्क्रिप्ट बनाई हैं, और अधिकांश समय मैं निपटान को परेशान नहीं करता हूं।

Here is a script wherein I dispose SPSite and SPWeb objects

Here is a script in which I don't bother to dispose an SPSite object

+1

उत्तर के लिए धन्यवाद। इन लिंक में अच्छी स्क्रिप्ट, बीटीडब्ल्यू। – naivists

+2

धन्यवाद! एक अच्छी कोडप्लेक्स प्रोजेक्ट है जिसने दर्जनों एसपी से संबंधित स्क्रिप्ट एकत्र की हैं: http://sharepointpsscripts.codeplex.com –

+2

असल में यह बिल्कुल सही नहीं है - जब प्रक्रिया समाप्त होती है, हाँ स्मृति को मुक्त किया जाता है लेकिन न तो निपटान और न ही अंतिम रूप दिया जाता है। यह सब इस बात पर निर्भर करता है कि वस्तु निपटान में क्या करती है लेकिन असल में, यह भेद शायद कोई फर्क नहीं पड़ता। – Josh

2

यदि शैल बाहरी संसाधन तक पहुंच रहा है जिसमें PowerShell स्क्रिप्ट के जीवन से अधिक जीवनकाल है, तो इसे निपटान करना चाहिए।

हालांकि, यदि यह स्क्रिप्ट द्वारा आवंटित संसाधन है, तो सफाई करने की कोई आवश्यकता नहीं है। जब स्क्रिप्ट निकलती है, तो स्क्रिप्ट के लिए आवंटित सभी मेमोरी साफ़ हो जाएंगी।

+2

यह सच नहीं है। भले ही इसे स्क्रिप्ट द्वारा आवंटित किया गया हो, फिर भी यह सड़क के नीचे स्मृति अपवादों का कारण बन सकता है। (क्यों लोग निम्न स्तर के नागरिकों के रूप में स्क्रिप्ट का इलाज करते हैं? ☺) – Ariel

4

आदर्श रूप में, जब संभव हो तो आपको निपटान करना चाहिए। PowerShell के अंदर भी।

शेयरपॉइंट पुस्तकालयों में बहुत सारे कोड शामिल हैं जो COM ऑब्जेक्ट्स के आस-पास एक रैपर है - और जीवन को और अधिक मजेदार बनाने के लिए, उनमें से कई COM ऑब्जेक्ट्स में अपने स्वयं के पूल और कैश होते हैं। निपटने के लिए .NET कॉल वास्तव में COM ऑब्जेक्ट्स को निर्देश देता है कि वे अपनी ऑब्जेक्ट्स को मुक्त कर सकते हैं (जो कॉलिंग प्रक्रिया के बाहर जीवनकाल हो सकता है)। http://blogs.msdn.com/sharepoint/archive/2009/02/11/sharepoint-and-powershell-knowledge.aspx

2

प्रक्रिया चीजों को साफ होगा बंद करते समय, सावधान रहें। यदि आप अपने खेत की सभी साइटों को शामिल करने वाले लूप को करना चाहते थे, तो एक लापता निपटान जल्दी से स्मृति की महत्वपूर्ण मात्रा में खा सकता है जो आपके सर्वर को क्रॉल में धीमा कर देगा। चूंकि स्क्रिप्टिंग बैच ऑपरेशंस के लिए सबसे उपयोगी है, हमेशा इसे ध्यान में रखें।

3

बस this का पालन करें।

यहां तक ​​कि अगर यह एक सरल स्क्रिप्ट है कि एक बार मार डाला स्मृति को मुक्त कर देते है, तो आप कभी पता नहीं कुछ बिंदु पर है कि क्या है कि वाला होना कॉपी/:-)

शुद्धता के लिए एक बड़ा स्क्रिप्ट की एक आंतरिक पाश में चिपकाया, तो आप हमेशा करना चाहिए ऊपर दिए गए लिंक में निर्दिष्ट एसपी ऑब्जेक्ट्स का निपटान करें।

+1

एक बड़ी लिपि में प्रतिलिपि/पेस्ट होने के बारे में बिंदु इतना सच है। मैंने कुछ प्रशासकों द्वारा बनाई गई स्क्रिप्ट देखी हैं, वेब पर मिली विभिन्न स्क्रिप्ट्स का संयोजन जो "साइड इफेक्ट" के रूप में उस क्षण को व्यवस्थापक की आवश्यकता भी करता है ;-) – naivists

संबंधित मुद्दे