SPANK(8) Slurm Component SPANK(8)

SPANK - معماری پلاگین Slurm برای کنترل گره و کار (Job and Node Control)

این راهنما به طور خلاصه قابلیت‌های معماری پلاگین Slurm برای کنترل گره و کار (SPANK) و همچنین فایل پیکربندی SPANK (به‌طور پیش‌فرض: plugstack.conf) را شرح می‌دهد.

SPANK یک رابط بسیار عمومی برای پلاگین‌های پشته‌پذیر (stackable) فراهم می‌کند که می‌توان از آن برای تغییر پویای کد راه‌اندازی کار در Slurm استفاده کرد. پلاگین‌های SPANK بدون نیاز به دسترسی به کد منبع Slurm ساخته می‌شوند. آن‌ها تنها کافی است در برابر فایل هدر spank.h از Slurm کامپایل شده و به فایل پیکربندی SPANK با نام plugstack.conf اضافه شوند تا در زمان اجرا هنگام راه‌اندازی کار بعدی بارگذاری گردند. از این رو، زیرساخت SPANK برای مدیران سیستم و سایر توسعه‌دهندگان قابلیت تغییر پویای رفتار زمان اجرای راه‌اندازی کارهای Slurm را با هزینه و زحمت اندک فراهم می‌سازد.

نکته: تمام پلاگین‌های SPANK هنگام ارتقای Slurm به یک نسخه اصلی (major release) جدید باید مجدداً کامپایل شوند. تضمین نمی‌شود که API مربوط به SPANK بین نسخه‌های اصلی سازگاری ABI داشته باشد. هر پلاگین SPANK که با کتابخانه‌های Slurm پیوند می‌خورد باید به دقت بررسی شود، زیرا APIها و هدرهای Slurm ممکن است در نسخه‌های اصلی تغییر کنند.

پلاگین‌های SPANK در حداکثر پنج زمینه (context) مجزا در طول یک کار Slurm بارگذاری می‌شوند. به طور خلاصه، این پنج زمینه عبارتند از:

در زمینه local، پلاگین توسط srun بارگذاری می‌شود (یعنی بخش «محلی» یک کار موازی).
در زمینه remote، پلاگین توسط slurmstepd بارگذاری می‌شود (یعنی بخش «دورست» یک کار موازی).
در زمینه allocator، پلاگین در یکی از ابزارهای تخصیص کار شامل salloc، sbatch یا scrontab بارگذاری می‌شود.
در زمینه slurmd، پلاگین در خود دیمن slurmd بارگذاری می‌شود. نکته: پلاگین‌های بارگذاری‌شده در زمینه slurmd در تمام مدت زمان اجرای slurmd فعال باقی می‌مانند، بنابراین در صورت تغییر پیکربندی یا به‌روزرسانی پلاگین‌ها، slurmd باید مجدداً راه‌اندازی شود تا تغییرات اعمال شوند.
در زمینه job_script، پلاگین‌ها در زمینه پرولوگ یا اپیلوگ کار بارگذاری می‌شوند. نکته: پلاگین‌ها در زمینه job_script در هر بار اجرای پرولوگ یا اپیلوگ کار، در یک فضای آدرس‌دهی مجزا از پلاگین‌های زمینه slurmd بارگذاری می‌شوند. این بدان معناست که هیچ وضعیتی بین این زمینه و زمینه‌های دیگر، یا حتی بین یک فراخوانی به slurm_spank_job_prolog یا slurm_spank_job_epilog و فراخوانی‌های بعدی به اشتراک گذاشته نمی‌شود.

در زمینه local، تنها توابع init، exit، init_post_opt و local_user_init فراخوانی می‌شوند. در زمینه allocator، فقط توابع init، exit و init_post_opt فراخوانی می‌گردند. به همین ترتیب، در زمینه slurmd تنها کالبک‌های init و slurmd_exit فعال هستند و در زمینه job_script فقط کالبک‌های job_prolog و job_epilog به کار گرفته می‌شوند. پلاگین‌ها می‌توانند زمینه‌ای را که در آن در حال اجرا هستند با استفاده از توابع spank_context و spank_remote تعریف‌شده در spank.h استعلام کنند.

پلاگین‌های SPANK ممکن است از چندین نقطه در طول فرآیند راه‌اندازی کار Slurm فراخوانی شوند. یک پلاگین می‌تواند توابع زیر را تعریف کند:

درست پس از بارگذاری پلاگین‌ها فراخوانی می‌شود. در زمینه remote، این فراخوانی درست پس از مقداردهی اولیه گام کار (job step) صورت می‌گیرد. این تابع پیش از هرگونه پردازش گزینه‌های پلاگین فراخوانی می‌شود.
هم‌زمان با پرولوگ کار فراخوانی می‌شود. اگر این تابع مقداری غیرصفر برگرداند و پلاگین SPANK شامل آن در plugstack.conf به‌صورت الزامی (required) مشخص شده باشد، گره‌ای که این تابع روی آن اجرا شده است در وضعیت تخلیه (drained) قرار خواهد گرفت.
در همان نقطه slurm_spank_init فراخوانی می‌شود، اما پس از آنکه تمام گزینه‌های کاربری ارسال‌شده به پلاگین پردازش شدند. دلیل تفکیک کالبک‌های init و init_post_opt این است که پلاگین‌ها بتوانند گزینه‌های سراسری سیستم مشخص‌شده در plugstack.conf را در کالبک init پردازش کنند، سپس گزینه‌های کاربر را مورد پردازش قرار دهند و در نهایت در صورت نیاز در slurm_spank_init_post_opt اقدامی انجام دهند. در صورت وجود یک کار ناهمگن (heterogeneous job)، تابع slurm_spank_init برای هر مؤلفه از کار یک‌بار فراخوانی می‌شود.
فقط در زمینه محلی (srun) و پس از پردازش تمام گزینه‌ها فراخوانی می‌شود. این تابع پس از در دسترس قرار گرفتن شناسه کار (job ID) و شناسه‌های گام (step IDs) فراخوانی می‌گردد. این رخداد در srun پس از انجام تخصیص، اما پیش از راه‌اندازی تسک‌ها انجام می‌شود.
پس از کاهش موقت دسترسی‌ها فراخوانی می‌شود (فقط در زمینه remote).
برای هر تسک درست پس از fork، اما پیش از حذف تمام دسترسی‌های ارتقایافته فراخوانی می‌شود. این تابع می‌تواند به صورت موازی با slurm_spank_task_post_fork اجرا شود (فقط در زمینه remote).
برای هر تسک درست قبل از execve (2) فراخوانی می‌شود. اگر حافظه را با cgroups محدود می‌کنید، حافظه تخصیص‌یافته در اینجا درون cgroup کار قرار خواهد گرفت (فقط در زمینه remote).
برای هر تسک از فرآیند والد پس از تکمیل fork (2) فراخوانی می‌شود. با توجه به اینکه slurmd هیچ تسکی را تا زمان تکمیل fork (2) برای تمام تسک‌ها اجرا (exec) نمی‌کند، تضمین می‌شود که این فراخوانی پیش از اجرای تسک کاربر انجام پذیرد. این فراخوانی می‌تواند به صورت موازی با slurm_spank_task_init_privileged اجرا شود (فقط در زمینه remote).
برای هر تسک در زمان جمع‌آوری وضعیت خروج آن توسط Slurm فراخوانی می‌شود (فقط در زمینه remote).
یک‌بار درست پیش از خروج slurmstepd در زمینه remote فراخوانی می‌شود. در زمینه local، پیش از خروج srun فراخوانی می‌گردد.
هم‌زمان با اپیلوگ کار فراخوانی می‌شود. اگر این تابع مقداری غیرصفر برگرداند و پلاگین SPANK شامل آن در plugstack.conf به‌صورت الزامی (required) باشد، گره مربوطه به وضعیت تخلیه (drained) درمی‌آید.
در slurmd هنگام خاموش شدن دیمن فراخوانی می‌شود.

تمام این توابع دارای الگوی اولیه (prototype) یکسانی هستند، به عنوان مثال:

int slurm_spank_init (spank_t spank, int ac, char *argv[])

که در آن spank دستگیره SPANK است که هنگام فراخوانی توابعی مانند spank_get_item و spank_getenv باید به Slurm بازگردانده شود. آرگومان‌های پیکربندی‌شده (بخش پیکربندی (CONFIGURATION) در ادامه را ببینید) در بردار آرگومان argv به همراه تعداد آرگومان‌ها ac ارسال می‌شوند.

یک پلاگین همچنین می‌تواند متغیرهای زیر را برای استفاده توسط Slurm تعریف کند:

هنگامی که فراخوانی slurm_spank_init شکست می‌خورد، نحوه مدیریت آن شکست توسط Slurm را تغییر می‌دهد. مقادیر مجاز عبارتند از:
سیستم Slurm گره را مقصر می‌داند و آن را در وضعیت تخلیه (drained) علامت‌گذاری می‌کند. ممکن است کار مجدداً در صف قرار گیرد (requeued). این مقدار پیش‌فرض است.
سیستم Slurm کار را مقصر می‌داند و آن را به عنوان شکست‌خورده علامت‌گذاری می‌کند (مجدداً در صف قرار نمی‌گیرد). گره تخلیه نخواهد شد.

پلاگین‌های SPANK می‌توانند فهرست فعلی نمادهای پشتیبانی‌شده slurm_spank را استعلام کنند تا مشخص شود آیا نسخه فعلی از یک قلاب (hook) خاص پلاگین پشتیبانی می‌کند یا خیر. این قابلیت مفید است زیرا فهرست نمادهای پلاگین ممکن است در آینده رشد کند. این استعلام با استفاده از تابع spank_symbol_supported با الگوی اولیه زیر انجام می‌شود:

int spank_symbol_supported (const char *sym);

اگر نماد پشتیبانی شود، مقدار بازگشتی 1 و در غیر این صورت 0 خواهد بود.

پلاگین‌های SPANK دسترسی مستقیمی به ساختارهای داده داخلی تعریف‌شده در Slurm ندارند. در عوض، اطلاعات مربوط به کاری که هم‌اکنون در حال اجرا است از طریق فراخوانی تابع spank_get_item به دست می‌آید.

spank_err_t spank_get_item (spank_t spank, spank_item_t item, ...);

به فراخوانی spank_get_item باید دستگیره فعلی SPANK و همچنین قلم مورد درخواست که توسط spank_item_t ارسالی مشخص می‌شود، داده شود. بسته به اینکه کدام قلم توسط پلاگین درخواست شده باشد، تعداد متغیری از آرگومان‌های اشاره‌گر نیز ارسال می‌شوند. فهرستی از مقادیر معتبر برای item در فایل هدر spank.h نگهداری می‌شود. چند نمونه عبارتند از:

شناسه کاربری (User id) برای کار در حال اجرا. نوع (uid_t *) آرگومان سوم spank_get_item است.
شناسه گام کار (Job step id) برای کار در حال اجرا. نوع (uint32_t *) آرگومان سوم spank_get_item است.
وضعیت خروج برای تسک پایان‌یافته. تنها از طریق slurm_spank_task_exit معتبر است. نوع (int *) آرگومان سوم spank_get_item است.
خط فرمان کامل کار. آرگومان‌های سوم و چهارم برای spank_get_item از نوع (int *, char ***) هستند.

برای جزئیات بیشتر به spank.h مراجعه کنید.

توابع SPANK در محیط‌های local و allocator باید از توابع getenv، setenv و unsetenv برای مشاهده و تغییر محیط کار استفاده کنند. توابع SPANK در محیط remote باید از توابع spank_getenv، spank_setenv و spank_unsetenv برای مشاهده و تغییر محیط کار بهره ببرند. تابع spank_getenv محیط کار را برای متغیر محیطی var جستجو کرده و مقدار فعلی را در یک بافر buf با طول len کپی می‌کند. تابع spank_setenv به یک پلاگین SPANK اجازه می‌دهد تا متغیری را در محیط کار تنظیم کرده یا بازنویسی کند و spank_unsetenv یک متغیر محیطی را از محیط کار حذف می‌نماید. الگوهای اولیه عبارتند از:

 spank_err_t spank_getenv (spank_t spank, const char *var,
			           char *buf, int len);
 spank_err_t spank_setenv (spank_t spank, const char *var,
			           const char *val, int overwrite);
 spank_err_t spank_unsetenv (spank_t spank, const char *var);

این توابع تنها در زمینه remote ضروری هستند، زیرا تغییرات در محیط فرآیند استاندارد با استفاده از setenv (3)، getenv (3) و unsetenv (3) می‌تواند در زمینه local انجام پذیرد.

توابعی نیز در داخل پلاگین‌های SPANK در دسترس هستند تا متغیرهای محیطی را برای صدور (export) به برنامه‌های PrologSlurmctld، Prolog، Epilog و EpilogSlurmctld در Slurm تعیین کنند (به اصطلاح محیط کنترل کار یا job control). نام متغیرهای محیطی که از طریق این فراخوانی‌ها ایجاد می‌شوند با رشته SPANK_ پیشوندگذاری می‌شود تا از هرگونه پیامد امنیتی ناشی از کنترل اختیاری متغیرهای محیطی جلوگیری شود (چرا که اسکریپت‌های کنترل کار با دسترسی root یا کاربر Slurm اجرا می‌شوند).

این توابع تنها در زمینه local در دسترس هستند.

  spank_err_t spank_job_control_getenv(spank_t spank, const char *var,
			             char *buf, int len);
  spank_err_t spank_job_control_setenv(spank_t spank, const char *var,
			             const char *val, int overwrite);
  spank_err_t spank_job_control_unsetenv(spank_t spank, const char *var);

برای اطلاعات بیشتر به spank.h مراجعه کنید.

بسیاری از توابع شرح داده‌شده SPANK که در دسترس پلاگین‌ها هستند، خطاها را از طریق نوع خطای spank_err_t بازمی‌گردانند. در صورت موفقیت، مقدار بازگشتی برابر با ESPANK_SUCCESS خواهد بود، در حالی که در صورت بروز خطا، مقدار بازگشتی روی یکی از مقادیر خطای متعددی که در spank.h تعریف شده است تنظیم می‌شود. رابط SPANK یک تابع ساده به شکل

const char * spank_strerror(spank_err_t err);
ارائه می‌دهد که می‌توان از آن برای تبدیل مقدار spank_err_t به نمایش متنی آن استفاده کرد.

از تابع slurm_spank_log می‌توان برای چاپ پیام‌ها به کاربر در سطح خطا استفاده کرد. هدف از این کار این است که کاربران نیازی به تکیه بر تابع slurm_error نداشته باشند؛ تابعی که ممکن است گیج‌کننده باشد زیرا عبارت "error:" را به ابتدای هر پیام اضافه می‌کند.

پلاگین‌های SPANK همچنین دارای رابطی هستند که از طریق آن می‌توانند گزینه‌های اضافی برای کارها را تعریف و پیاده‌سازی کنند. این گزینه‌ها از طریق دستورات Slurm مانند srun(1)، salloc(1) و sbatch(1) در دسترس کاربر قرار می‌گیرند. اگر گزینه توسط کاربر مشخص شود، مقدار آن هنگام اجرای کار فوروارد شده و در slurmd نزد پلاگین ثبت می‌شود. از این طریق، پلاگین‌های SPANK می‌توانند به صورت پویا گزینه‌ها و قابلیت‌های جدیدی را به Slurm اضافه کنند.

هر گزینه‌ای که توسط یک پلاگین در Slurm ثبت می‌شود در قالب یک struct spank_option قرار دارد که در spank.h به این صورت تعریف شده است:

struct spank_option {
   char *         name;
   char *         arginfo;
   char *         usage;
   int            has_arg;
   int            val;
   spank_opt_cb_f cb;
};

که در آن

نام گزینه است. طول آن به مقدار SPANK_OPTION_MAXLEN تعریف‌شده در spank.h محدود می‌شود.
شرحی از آرگومان گزینه است، در صورتی که گزینه آرگومان دریافت کند.
شرح کوتاهی از گزینه است که برای نمایش در خروجی --help مناسب است.
مقدار 0 اگر گزینه آرگومان دریافت نکند، 1 اگر گزینه یک آرگومان دریافت کند، و 2 اگر گزینه یک آرگومان اختیاری دریافت نماید (به getopt_long (3) مراجعه کنید).
مقداری محلی برای پلاگین که به تابع کالبک گزینه برگردانده می‌شود.
یک تابع کالبک که هنگام ثبت گزینه پلاگین در Slurm فراخوانی می‌شود. نوع spank_opt_cb_f در spank.h به صورت زیر تعریف شده است:
  typedef int (*spank_opt_cb_f) (int val, const char *optarg,
			                 int remote);
که در آن val مقدار فیلد val در ساختار spank_option است، optarg آرگومان ارائه‌شده (در صورت وجود) است، و remote اگر تابع از میزبان «محلی» فراخوانی شود (مانند میزبانی که در آن srun یا sbatch/salloc اجرا می‌شوند) برابر با 0 و از میزبان «دورست» (میزبانی که slurmd/slurmstepd روی آن اجرا می‌شوند) برابر با 1 خواهد بود، اما تنها در صورتی توسط slurmstepd (زمینه remote) اجرا می‌شود که گزینه برای چنین زمینه‌ای ثبت شده باشد.

گزینه‌های پلاگین را می‌توان با استفاده از تابع spank_option_register در Slurm ثبت کرد. این تابع تنها زمانی معتبر است که از هندلر slurm_spank_init در پلاگین فراخوانی شود و در هر بار یک گزینه را ثبت می‌کند. الگوی اولیه به این صورت است:

   spank_err_t spank_option_register (spank_t sp,
			   struct spank_option *opt);
این تابع در صورت ثبت موفقیت‌آمیز یک گزینه مقدار ESPANK_SUCCESS، یا در صورت بروز خطا (از جمله دستگیره نامعتبر spank_t یا زمانی که تابع از داخل تابع slurm_spank_init فراخوانی نشده باشد) مقدار ESPANK_BAD_ARG را برمی‌گرداند. تمام گزینه‌ها باید از تمامی زمینه‌هایی که در آن‌ها استفاده خواهند شد ثبت گردند. به عنوان مثال، اگر یک گزینه فقط در زمینه‌های local (srun) و remote (slurmd) به کار می‌رود، پس spank_option_register تنها باید از داخل همان زمینه‌ها فراخوانی شود؛ برای نمونه:
if (spank_context() != S_CTX_ALLOCATOR)
   spank_option_register (sp, opt);
اگر گزینه در تمام زمینه‌ها مورد استفاده قرار می‌گیرد، باید spank_option_register در همه جا فراخوانی شود.

علاوه بر spank_option_register، پلاگین‌ها می‌توانند با تعریف جدولی از struct spank_option با نام نماد spank_options نیز گزینه‌ها را به Slurm صادر کنند. با این حال، این روش برای استفاده با sbatch و salloc (زمینه allocator) پشتیبانی نمی‌شود، بنابراین استفاده از spank_option_register ترجیح داده می‌شود. هنگام استفاده از جدول spank_options، آخرین عنصر در آرایه باید با صفر پر شود. ماکروی SPANK_OPTIONS_TABLE_END برای این منظور در spank.h فراهم شده است.

هنگامی که یک گزینه توسط کاربر در سمت محلی (خواه از طریق گزینه‌های خط فرمان یا متغیرهای محیطی) ارائه شود، Slurm بلافاصله کالبک گزینه را با remote=0 فراخوانی می‌کند. این فراخوانی برای این است که پلاگین پیش از ارسال مقدار به سمت دورست در زمان راه‌اندازی کار، اعتبارسنجی محلی (sanity checking) گزینه را انجام دهد. اگر آرگومان مشخص‌شده توسط کاربر نامعتبر باشد، پلاگین باید یک خطا اعلام کرده و یک کد بازگشتی غیرصفر از کالبک صادر کند. پلاگین باید بتواند مواردی را که گزینه spank چندین بار از طریق متغیرهای محیطی و گزینه‌های خط فرمان تنظیم شده است مدیریت کند. متغیرهای محیطی پیش از گزینه‌های خط فرمان پردازش می‌شوند.

در سمت دورست، گزینه‌ها و آرگومان‌های آن‌ها درست پس از بارگذاری پلاگین‌های SPANK و قبل از فراخوانی هندلر spank_init ثبت می‌شوند. این سازوکار به پلاگین‌ها اجازه می‌دهد تا رفتار تمام قابلیت‌های پلاگین را بر اساس مقدار گزینه‌های ارائه‌شده توسط کاربر تغییر دهند.

به عنوان جایگزینی برای استفاده از کالبک گزینه و متغیر سراسری، پلاگین‌ها می‌توانند از تابع spank_option_getopt برای بررسی گزینه‌های ارائه‌شده پس از پردازش گزینه‌ها استفاده کنند. الگوی اولیه این تابع به صورت زیر است:

spank_err_t spank_option_getopt(spank_t sp,
    struct spank_option *opt, char **optargp);
اگر گزینه تعریف‌شده در struct spank_option opt توسط کاربر استفاده شده باشد، این تابع مقدار ESPANK_SUCCESS را برمی‌گرداند. اگر optargp مقدار غیر تهی (non-NULL) داشته باشد، روی هر آرگومان گزینه‌ای که ارسال شده باشد تنظیم می‌شود (در صورتی که گزینه آرگومان دریافت کند). استفاده از این روش برای پردازش گزینه‌ها در زمینه job_script (slurm_spank_job_prolog و slurm_spank_job_epilog) الزامی است. این تابع در زمینه‌های زیر معتبر است: slurm_spank_job_prolog، slurm_spank_local_user_init، slurm_spank_user_init، slurm_spank_task_init_privileged، slurm_spank_task_init، slurm_spank_task_exit، و slurm_spank_job_epilog.

فایل پیکربندی پیش‌فرض پشته پلاگین‌های SPANK فایل plugstack.conf در همان دایرکتوری slurm.conf(5) است، هرچند این مسیر را می‌توان از طریق پارامتر پیکربندی PlugStackConfig در Slurm تغییر داد. به طور معمول فایل plugstack.conf باید روی تمام گره‌های کلاستر یکسان باشد. فایل پیکربندی، پلاگین‌های SPANK را به صورت یک پلاگین در هر سطر، همراه با مشخص کردن اینکه پلاگین required (الزامی) یا optional (اختیاری) است، و هرگونه آرگومان سراسری که باید برای پیکربندی زمان اجرا به پلاگین ارسال شود، فهرست می‌کند. توضیحات (کامنت‌ها) با کاراکتر '#' آغاز شده و تا انتهای خط ادامه می‌یابند. در صورتی که فایل پیکربندی موجود نباشد یا خالی باشد، نادیده گرفته خواهد شد.

نکته: پلاگین‌های SPANK باید روی ماشین‌هایی که slurmd را اجرا می‌کنند (گره‌های محاسباتی) و همچنین روی ماشین‌هایی که ابزارهای تخصیص کار مانند salloc، sbatch و غیره را اجرا می‌کنند (گره‌های لاگین) نصب شوند.

قالب هر خط غیرتوضیحی در فایل پیکربندی به این صورت است:

required/optional   plugin   arguments
برای مثال:
optional /usr/lib/slurm/test.so
به slurmd دستور می‌دهد تا پلاگین test.so را بدون ارسال هیچ آرگومانی بارگذاری کند. اگر یک پلاگین SPANK از نوع required باشد، شکست هر یک از توابع پلاگین باعث می‌شود که slurmd یا دستور تخصیص‌دهنده کار، آن کار را متوقف کند، در حالی که پلاگین‌های optional تنها باعث ایجاد یک هشدار می‌شوند.

اگر یک مسیر کامل (fully-qualified path) برای یک پلاگین مشخص نشود، مسیر پیکربندی‌شده فعلی PluginDir در slurm.conf(5) جستجو می‌شود.

پلاگین‌های SPANK پشته‌پذیر (stackable) هستند، به این معنی که بیش از یک پلاگین را می‌توان در فایل پیکربندی قرار داد. پلاگین‌ها به ترتیب و یکی پس از دیگری فراخوانی خواهند شد، و اقدام مقتضی در صورت بروز خطا با توجه به وضعیت فلگ optional پلاگین انجام می‌گیرد.

فایل‌های پیکربندی اضافی یا دایرکتوری‌های حاوی فایل‌های پیکربندی را می‌توان با کلمه کلیدی include در plugstack.conf گنجاند. کلمه کلیدی include باید در سطری جداگانه قرار گیرد و یک الگو (glob) را به عنوان پارامتر دریافت کند؛ بنابراین چندین فایل را می‌توان از یک خط include وارد کرد. برای مثال، ساختار زیر تمام فایل‌های پیکربندی موجود در پوشه /etc/slurm/plugstack.conf.d را به ترتیب مرتب‌سازی محلی بارگذاری می‌کند:

include /etc/slurm/plugstack.conf.d/*
که ممکن است روشی انعطاف‌پذیرتر برای ایجاد پشته‌ای از پلاگین‌های spank در نظر گرفته شود.

فایل پیکربندی SPANK در هر بار راه‌اندازی کار مجدداً خوانده می‌شود، بنابراین ویرایش فایل پیکربندی بر کارهای در حال اجرا تأثیری نخواهد داشت. با این حال باید مراقبت شود که یک فایل پیکربندی نیمه‌ویرایش‌شده توسط کاری که در حال راه‌اندازی است خوانده نشود.

هنگامی که پلاگین SPANK یک نتیجه غیرصفر برمی‌گرداند، تغییرات زیر حاصل خواهد شد:

Command Function Context Exitcode Drains Node Fails job
srun slurm_spank_init local 1 no yes
srun slurm_spank_init_post_opt local 1 no yes
srun slurm_spank_local_user_init local 1 no yes
srun slurm_spank_init remote 1 no no
srun slurm_spank_user_init remote 0 no no
srun slurm_spank_task_init_privileged remote 1 no yes
srun slurm_spank_task_post_fork remote 0 no no
srun slurm_spank_task_init remote 1 no yes
srun slurm_spank_task_exit remote 0 no no
srun slurm_spank_exit local 0 no yes
salloc slurm_spank_init allocator 1 no yes
salloc slurm_spank_init_post_opt allocator 1 no yes
salloc slurm_spank_init remote 1 no no
salloc slurm_spank_user_init remote 1 no yes
salloc slurm_spank_task_init_privileged remote 1 no yes
salloc slurm_spank_task_post_fork remote 1 no yes
salloc slurm_spank_task_init remote 1 no yes
salloc slurm_spank_task_exit remote 0 no no
salloc slurm_spank_exit allocator 0 no yes
sbatch slurm_spank_init allocator 1 no yes
sbatch slurm_spank_init_post_opt allocator 1 no yes
sbatch slurm_spank_init remote 1 yes no
sbatch slurm_spank_user_init remote 1 yes yes
sbatch slurm_spank_task_init_privileged remote 1 no yes
sbatch slurm_spank_task_post_fork remote 1 yes yes
sbatch slurm_spank_task_init remote 1 no yes
sbatch slurm_spank_task_exit remote 0 no no
sbatch slurm_spank_exit allocator 0 no no
scrontab slurm_spank_init allocator 1 no no
scrontab slurm_spank_exit allocator 0 no no

نکته: رفتار مربوط به ProctrackType=proctrack/pgid ممکن است در صورت بروز خطا برای slurm_spank_task_post_fork در زمینه remote به اتمام مهلت زمانی (timeout) منجر شود.

Portions copyright (C) 2010-2022 SchedMD LLC.
Copyright (C) 2006 The Regents of the University of California.
Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
CODE-OCEC-09-009. All rights reserved.

این فایل بخشی از Slurm است که یک برنامه مدیریت منابع به شمار می‌رود. برای جزئیات بیشتر به https://slurm.schedmd.com مراجعه کنید.

سامانه Slurm یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو (GNU General Public License) همان‌گونه که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، چه نسخه ۲ مجوز و چه (به انتخاب خودتان) هر نسخه پس از آن، مجدداً توزیع کرده یا تغییر دهید.

سامانه Slurm با این امید توزیع می‌شود که مفید واقع شود، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابل فروش بودن یا تناسب برای یک هدف خاص. برای جزئیات بیشتر به مجوز عمومی همگانی گنو مراجعه کنید.

/etc/slurm/slurm.conf - فایل پیکربندی Slurm.
/etc/slurm/plugstack.conf - فایل پیکربندی SPANK.
/usr/include/slurm/spank.h - فایل هدر SPANK.

srun(1), slurm.conf(5)

Slurm Component Slurm 26.05