تشغيل برنامج نصي لبدء تشغيل خدمة كمستخدم محلي أو حساب نظام

قبل أن تبدأ خدمة Service Fabric القابلة للتنفيذ، قد يكون من الضروري تشغيل بعض أعمال التكوين أو أعمال الإعداد. على سبيل المثال، تكوين متغيرات البيئة. يمكنك تحديد برنامج نصي ليتم تشغيله قبل بدء تشغيل الملف التنفيذي للخدمة في بيان الخدمة للخدمة. من خلال تكوين نهج RunAs لنقطة إدخال إعداد الخدمة، يمكنك تغيير الحساب الذي يعمل من خلاله الإعداد القابل للتنفيذ. تتيح لك نقطة إدخال الإعداد المنفصلة تشغيل تكوين متميز بدرجة عالية لفترة قصيرة من الوقت، لذلك لا يحتاج مضيف الخدمة القابل للتنفيذ إلى التشغيل بامتيازات عالية لفترات طويلة من الوقت.

نقطة إدخال الإعداد (SetupEntryPoint في بيان الخدمة) هي نقطة إدخال متميزة يتم تشغيلها بشكل افتراضي بنفس بيانات الاعتماد مثل Service Fabric (عادةً ما يكون حساب NetworkService ) قبل أي نقطة دخول أخرى. عادةً ما يكون الملف التنفيذي الذي تم تحديده بواسطة EntryPoint هو مضيف الخدمة الذي يعمل لفترة طويلة. يتم تشغيل الملف التنفيذي EntryPoint بعد إنهاء الملف التنفيذي SetupEntryPoint بنجاح. تتم مراقبة العملية الناتجة وإعادة تشغيلها، وتبدأ مرة أخرى باستخدام SetupEntryPoint إذا تم إنهاؤها أو تعطلت.

تكوين نقطة إدخال لإعداد الخدمة

ما يلي هو مثال بسيط لبيان التطبيق عن خدمة عديمة الحالة تحدد البرنامج النصي للإعداد MySetup.bat في الخدمة SetupEntryPoint. يتم استخدام الوسيطات لتمرير الوسائط إلى البرنامج النصي عند تشغيله.

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="MyStatelessServicePkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="https://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <Description>An example service manifest.</Description>
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="MyStatelessServiceType" />
  </ServiceTypes>

  <!-- Code package is your service executable. -->
  <CodePackage Name="Code" Version="1.0.0">
    <SetupEntryPoint>
      <ExeHost>
        <Program>MySetup.bat</Program>
        <Arguments>MyValue</Arguments>
        <WorkingFolder>Work</WorkingFolder>        
      </ExeHost>
    </SetupEntryPoint>
    <EntryPoint>
      <ExeHost>
        <Program>MyStatelessService.exe</Program>
      </ExeHost>
    </EntryPoint>
  </CodePackage>

  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <Endpoint Name="ServiceEndpoint" />
    </Endpoints>
  </Resources>
</ServiceManifest>

تكوين النهج لنقطة إدخال إعداد الخدمة

بشكل افتراضي، يتم تشغيل نقطة إدخال إعداد الخدمة القابلة للتنفيذ تحت نفس بيانات الاعتماد مثل Service Fabric (عادةً حساب NetworkService). في بيان التطبيق، يمكنك تغيير أذونات الأمان لتشغيل البرنامج النصي لبدء التشغيل ضمن حساب نظام محلي أو حساب مسؤول.

تكوين النهج باستخدام حساب نظام محلي

يوضح مثال بيان التطبيق التالي كيفية تكوين نقطة إدخال إعداد الخدمة للتشغيل ضمن حساب مسؤول المستخدم (SetupAdminUser).

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="MyStatelessService_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyStatelessServicePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
    </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="MyStatelessService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="MyStatelessServiceType" InstanceCount="[MyStatelessService_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Users>
      <User Name="SetupAdminUser">
        <MemberOf>
          <SystemGroup Name="Administrators" />
        </MemberOf>
      </User>
    </Users>
  </Principals>
</ApplicationManifest>

أولاً، قم بإنشاء قسم Principals باسم مستخدم، مثل SetupAdminUser. حساب المستخدم SetupAdminUser هو عضو في مجموعة نظام المسؤولين.

بعد ذلك، ضمن قسم ServiceManifestImport، قم بتكوين نهج لتطبيق هذا المبدأ على SetupEntryPoint. يقوم هذا النهج بإعلام Service Fabric أنه عند تشغيل ملف MySetup.bat، يجب تشغيله كـ SetupAdminUser (مع امتيازات المسؤول). نظراً لأنك لم تطبق نهجاً على نقطة الإدخال الرئيسية، فإن التعليمة البرمجية الموجودة في MyServiceHost.exe تعمل ضمن حساب النظام NetworkService. هذا هو الحساب الافتراضي الذي يتم تشغيل جميع نقاط إدخال الخدمة به.

تكوين النهج باستخدام حسابات النظام المحلي

في كثير من الأحيان، يُفضل تشغيل البرنامج النصي لبدء التشغيل باستخدام حساب نظام محلي بدلاً من حساب مسؤول. لا يعمل تشغيل نهج RunAs كعضو في مجموعة المسؤولين عادةً بشكل جيد لأن أجهزة الكمبيوتر بها تمكين التحكم في وصول المستخدم (UAC) بشكل افتراضي. في مثل هذه الحالات، يوصى بتشغيل SetupEntryPoint مثل LocalSystem، بدلاً من تشغيله كمستخدم محلي مضاف إلى مجموعة المسئولين. يوضح المثال التالي إعداد SetupEntryPoint للتشغيل كنظام محلي:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="MyStatelessService_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyStatelessServicePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
         <RunAsPolicy CodePackageRef="Code" UserRef="SetupLocalSystem" EntryPointType="Setup" />
      </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="MyStatelessService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="MyStatelessServiceType" InstanceCount="[MyStatelessService_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
      <Users>
         <User Name="SetupLocalSystem" AccountType="LocalSystem" />
      </Users>
   </Principals>
</ApplicationManifest>

ملاحظة

بالنسبة لمجموعات Linux، لتشغيل خدمة أو نقطة إدخال الإعداد كـ جذر، يمكنك تحديد AccountType كـ LocalSystem.

تشغيل برنامج نصي من نقطة إدخال الإعداد

أضف الآن برنامج نصي لبدء التشغيل إلى المشروع ليتم تشغيله بموجب امتيازات المسؤول.

في Visual Studio، انقر بزر الماوس الأيمن فوق مشروع الخدمة وأضف ملفاً جديداً باسم MySetup.bat.

بعد ذلك، تأكد من تضمين ملف MySetup.bat في حزمة الخدمة. غير مُضمن، بشكل افتراضي. حدد الملف، وانقر بزر الماوس الأيمن للحصول على قائمة السياق، واختر Properties. في مربع الحوار "Properties"، تأكد من تعيين Copy to Output Directory إلى Copy if newer. راجع لقطة الشاشة التالية.

Visual Studio CopyToOutput لملف دفعة SetupEntryPoint

الآن قم بتحرير ملف MySetup.bat وقم بإضافة الأوامر التالية لتعيين متغير بيئة النظام وإخراج ملف نصي:

REM Set a system environment variable. This requires administrator privilege
setx -m TestVariable %*
echo System TestVariable set to > out.txt
echo %TestVariable% >> out.txt

REM To delete this system variable us
REM REG delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TestVariable /f

بعد ذلك، قم بإنشاء الحل لنظام مجموعة التنمية المحلية ونشره. بعد بدء الخدمة، كما هو موضح في Service Fabric Explorer، يمكنك أن ترى أن ملف MySetup.bat كان ناجحاً بطريقتين. افتح موجه أوامر PowerShell واكتب:

PS C:\ [Environment]::GetEnvironmentVariable("TestVariable","Machine")
MyValue

ثم، لاحظ اسم العقدة حيث تم نشر الخدمة وبدأ تشغيلها في Service Fabric Explorer. على سبيل المثال، العقدة 2. بعد ذلك، انتقل إلى مجلد عمل مثيل التطبيق للعثور على ملف out.txt الذي يعرض قيمة TestVariable. على سبيل المثال، إذا تم نشر هذه الخدمة في العقدة 2، فيمكنك الانتقال إلى هذا المسار لـ MyApplicationType:

C:\SfDevCluster\Data\_App\Node.2\MyApplicationType_App\work\out.txt

تشغيل أوامر PowerShell من نقطة إدخال الإعداد

لتشغيل PowerShell من نقطة SetupEntryPoint، يمكنك تشغيل PowerShell.exe في ملف الدُفعة يشير إلى ملف PowerShell. أولاً، أضف ملف PowerShell إلى مشروع الخدمة - على سبيل المثال، MySetup.ps1. تذكر تعيين الخاصية Copy if newer بحيث يتم تضمين الملف أيضاً في حزمة الخدمة. يوضح المثال التالي نموذجاً لملف الدُفعة الذي يبدأ تشغيل ملف PowerShell باسم MySetup.ps1، والذي يقوم بتعيين متغير بيئة نظام يسمى TestVariable.

MySetup.bat لبدء تشغيل ملف PowerShell:

powershell.exe -ExecutionPolicy Bypass -Command ".\MySetup.ps1"

في ملف PowerShell، أضف ما يلي لتعيين متغير بيئة النظام:

[Environment]::SetEnvironmentVariable("TestVariable", "MyValue", "Machine")
[Environment]::GetEnvironmentVariable("TestVariable","Machine") > out.txt

ملاحظة

عند تشغيل الملف الدُفعة بشكل افتراضي، فإنه يبحث في مجلد التطبيق المسمى work للملفات. في هذه الحالة، عند تشغيل MySetup.bat، نريد أن نجد ملف MySetup.ps1 في نفس المجلد، وهو مجلد التطبيق code package. لتغيير هذا المجلد، قم بتعيين مجلد العمل:

<SetupEntryPoint>
    <ExeHost>
    <Program>MySetup.bat</Program>
    <WorkingFolder>CodePackage</WorkingFolder>
    </ExeHost>
</SetupEntryPoint>

تصحيح أخطاء برنامج نصي لبدء التشغيل محلياً باستخدام إعادة توجيه وحدة التحكم

سيكون من المفيد، من حين لآخر لأغراض تصحيح الأخطاء، رؤية إخراج وحدة التحكم من تشغيل برنامج نصي للإعداد. يمكنك تعيين نهج إعادة توجيه وحدة التحكم على نقطة إدخال الإعداد في بيان الخدمة، والذي يكتب الناتج إلى ملف. تتم كتابة إخراج الملف إلى مجلد التطبيق المسمى تسجيل الدخول على عقدة نظام المجموعة حيث يتم توزيع التطبيق وتشغيله، يمكن العثور عليه في C:\SfDeployCluster\_App\{application-name}\log. قد ترى رقمًا بعد اسم تطبيقاتك في المسار. يتزايد هذا الرقم عند كل عملية نشر. تتضمن الملفات المكتوبة إلى مجلد السجل Code_{service-name}Pkg_S_0.err، وهو إخراج الخطأ القياسي، وCode_{service-name}Pkg_S_0.out، وهو الإخراج القياسي. قد ترى أكثر من مجموعة من الملفات استنادًا إلى محاولات تنشيط الخدمة.

تحذير

لا تستخدم نهج إعادة توجيه وحدة التحكم مطلقاً في تطبيق تم نشره في الإنتاج لأن هذا يمكن أن يؤثر على تجاوز فشل التطبيق. استخدم هذا النهج فقط لأغراض التطوير المحلي وتصحيح الأخطاء.

يوضح مثال بيان الخدمة التالي تعيين إعادة توجيه وحدة التحكم بقيمة FileRetentionCount:

<SetupEntryPoint>
    <ExeHost>
    <Program>MySetup.bat</Program>
    <WorkingFolder>CodePackage</WorkingFolder>
    <ConsoleRedirection FileRetentionCount="10"/>
    </ExeHost>
</SetupEntryPoint>

إذا قمت الآن بتغيير ملف MySetup.ps1 لكتابة أمر Echo، فسيتم الكتابة إلى ملف الإخراج لأغراض تصحيح الأخطاء:

Echo "Test console redirection which writes to the application log folder on the node that the application is deployed to"

تحذير

بعد تتبع أخطاء البرنامج النصي الخاص بك، قم فوراً بإزالة نهج إعادة توجيه وحدة التحكم هذه.

الخطوات التالية