PM2 یک نرمافزار حرفهای برای مدیریت برنامههای Node.js است که امکانات ساده اما کاربردی مانند امکان خاموش/روشن کردن یا روشن شدن به صورت خودکار (شبیه به سرویس در سیستم عامل) رو برای یک برنامه فراهم میکنه. هرچند که PM2 به صورت اختصاصی برای Node.js ساخته شده و امکانات انحصاری از جمله clustering و load balancing رو برای Node.js به راحتی فراهم میکنه، اما برای هر نوع برنامهای (process، اسکریپت یا دستور سیستم عامل)، به عنوان مثال برای اجرای برنامههای python یا فایلهای exe و dll، قابل استفاده است.
کاربرد اصلی PM2 تو محیطهای عملیاتی است که یا تعداد برنامهها زیاده و نیاز به مدیریت داره یا صرفا روشن شدن خودکار (مثلا اگر برنامه خطا داد مجدد روشن بشه) اهمیت داره. در ادامه نگاهی کلی به قابلیتها، نحوه نصب و دستورات PM2 داریم.
وبسایت رسمی: pm2.keymetrics.io
فهرست مطالب
قابلیتهای PM2نصب و راهاندازی PM2 دستورات PM2پیکربندی و اجرای چندین برنامه راهاندازی خودکار با سرویس سیستم عامل
قابلیتهای PM2
- اطلاعات پایه هر برنامه (نام و آرگومان ورودی دلخواه، شناسه process در سیستم عامل، میزان مصرف حافظه و پردازنده)
- ایجاد محدودیت مصرف حافظه (ریاستارت پس از مصرف بیش از حد)
- تنظیمات و پیکربندی (تعداد دفعات، تاخیر و بازه زمانی تلاش مجدد برای روشن شدن خودکار)
- ریاستارت به صورت دورهای (شبیه به cron)
- امکان watch و ریاستارت با تغییرات فایل مشخص شده
- امکان clustering برای processهای Node.js
- ذخیره خروجی برنامه در فایل (دستورات print و console در زبانهای مختلف)
- ذخیره لیست برنامههای فعلی و روشن کردن خودکار با boot سیستم عامل
- مشاهده اطلاعات و log به صورت زنده (مانیتورینگ)
نصب و راهاندازی PM2
قبل از نصب PM2 باید از آماده بودن Node.js و NPM تو سیستم مورد نظر مطمئن باشید. برای نصب Node.js (به همراه NPM) میتونید از مطلب نصب و راهاندازی Node.js استفاده کنید.
اگر به اینترنت دسترسی داشته باشید کافیه دستور npm i -g pm2
رو اجرا کنید تا PM2 به صورت global نصب بشه و در صورتی که دستگاه مورد نظر به اینترنت دسترسی نداشته باشه میتونید از مطلب نصب در ویندوز بدون اینترنت استفاده کنید.
با اجرای دستور pm2 -v
راهاندازی اولیه انجام میشه.
اجرا با تنظیمات پیش فرض
برای تست، یک برنامه Node.js اجرا میکنیم که هر ثانیه تو خروجی متنی رو نمایش میده و بعد از ۳ ثانیه crash میکنه و خطا میده.
کد autoCrash.mjs
:
setInterval(() => {
console.log(`App is alive ${new Date().toLocaleTimeString()}`)
}, 1000);
setTimeout(() => {
throw new Error("Something unexpected happened!");
}, 3000);
اگر این برنامه رو مستقیم با node اجرا کنیم (node autoCrash.mjs
) هر ثانیه متنی رو نمایش میده و بعد از ۳ ثانیه با ایجاد یک خطا، خارج میشه. اما اگر با دستور pm2 start autoCrash.mjs
اجرا بشه، بعد از خطا و بسته شدن برنامه، PM2 مجددا اون رو اجرا میکنه. میتونید با دستور pm2 log 0
و pm2 monit
خروجی برنامه و مشخصاتش رو مشاهده کنید. اینجا عدد صفر به معنی شماره برنامه تو لیست برنامههای PM2 هستش که در ادامه دستورات اصلی PM2 رو هم بررسی میکنیم.
دستورات PM2
pm2 list
یا به اختصار pm2 l
: لیست برنامههای ذخیره شده در PM2. جدول خروجی این دستور شامل اطلاعاتی از جمله شناسه عددی، نام، ورژن، وضعیت اجرا (روشن، خاموش، خطا یا ...)، تعداد دفعات ریاستارت، میزان مصرف پردازنده و حافظه است.
pm2 start/stop/restart [id]
: ساختار دستورات روشن/خاموش و ریاستارت برنامه با شناسه عددی یا نام id در لیست. همچنین کلمه کلیدی all عملیات مورد نظر رو بر روی تمام برنامهها اجرا میکنه. به عنوان مثال: pm2 stop 1
، pm2 stop all
یا pm2 restart appName
pm2 monit
: صفحه مانیتورینگ شامل اطلاعات نمایشی در دستور list + نمایش خروجی console به صورت زنده (لاگهای قدیمی نمایش داده نمیشه)، همچنین اطلاعات مربوط به عملکرد (memory heap و ...) برای برنامههای Node.js قابل مشاهده است.
pm2 imonit
: مانیتورینگ مصرف منابع (حافظه و پردازنده) در لحظه.
pm2 info [id]
: نمایش اطلاعات و وضعیت یک برنامه، به عنوان مثال pm2 info 0
.
pm2 reset [id]
: ریست کردن شمارنده تعداد ریاستارت.
pm2 log [id]
: مشاهده آخرین خروجی برنامه.
pm2 flush [id]
: پاکسازی و حذف خروجیهای ذخیره شده در فایل. برای مثال: pm2 flush appName
یا pm2 flush all
.
برای مشاهده لیست کامل دستورات از pm2 --help
استفاده کنید.
پیکربندی و اجرای چندین برنامه
اگر بخوایم چند برنامه رو با PM2 اجرا کنیم، امکان استفاده از یک فایل پیکربندی (configuration) برای مدیریت و نظم بهتر وجود داره. همچنین جهت استفاده از PM2 برای برنامههای غیر Node.js مثل dotnet ،python یا هر runtime و اسکریپت دیگهای، این فایل کانفیگ بکار میاد.
با اجرای دستور pm2 init simple
، یک فایل کانفیگ با اسم ecosystem.config.js ایجاد میشه و میتونید این فایل رو به صورت دستی هم ایجاد کنید. اسم فایل مهم نیست، فقط کافیه با .config.js
تموم بشه. این فایل در واقع یک ماژول Node.js از نوع CommonJS هستش و داخل فایل باید لیستی از برنامهها export بشن. برای مثال:
module.exports = {
apps : [{
name : "auto-crash",
script : "./autoCrash.js"
}]
}
لیست تنظیمات و پارامترهایی که وجود داره رو میتونید از صفحه پیکربندی در وبسایت رسمی PM2 مشاهده کنید. از مهمترین پارامترها میشه به موارد زیر اشاره کرد:
name: نام نمایشی در لیست
script: آدرس برنامه (Node.js) یا دستوری که میخوایم در ترمینال سیستم عامل اجرا بشه
cwd: آدرس پوشهای که میخوایم برنامه اونجا اجرا بشه (Current Working Directory)
args: آرگومانهای ورودی به script
watch: ریاستارت کردن خودکار برنامه با تغییر فایلهای داخل پوشه آن
max_memory_restart: ریاستارت خودکار برنامه با مصرف حافظه بیش از مقدار مشخص شده (مثلا 150M برای ریاستارت کردن با مصرف حافظه بیش از ۱۵۰ مگابایت)
env: پاس دادن مقادیر environment
min_uptime: حداقل زمان اجرای برنامه برای در نظر گرفتن به عنوان اجرای موفق
autorestart: ریاستارت خودکار پس از خروج و بسته شدن برنامه
restart_delay: فاصله زمانی بین ریاستارت شدن خودکار
max_restarts: حداکثر تلاشهای متوالی ریاستارت خودکار
بعد از آمادهسازی این فایل کافیه با دستور pm2 start ecosystem.config.js
اجراش کنید.
اجرای برنامههای غیر Node.js
همونطور که بالاتر اشاره شد، PM2 محدودیتی برای اجرای فایلها و برنامهها نداره و میشه باهاش هر برنامه یا دستوری رو اجرا کرد. مثلا اگر یک فایل .exe و یک کد پایتون رو با استفاده از فایل پیکربندی اجرا کنیم:
module.exports = {
apps: [{
name: "MainApiServer",
cwd: "C:\\Applications",
script: "ApiServer.exe"
}, {
name: "PythonApp",
cwd: "C:\\py-apps",
script: "python",
args: ["py-test.py"]
}]
}
یا یک DLL رو با dotnet اجرا کنیم:
module.exports = {
apps: [{
name: "MainApiServer",
cwd: "C:\\Applications",
script: "dotnet",
args: ["ApiServer.dll"]
}]
}
* در نظر داشته باشید امکان اجرای کد Node.js داخل فایل پیکربندی وجود داره و میشه برای محیطها، سیستم عاملها و شرایط مختلف کانفیگهای متفاوت هم ایجاد کرد.
راهاندازی خودکار با سرویس سیستم عامل
اجرای مجدد بعد از ریاستارت شدن سیستم عامل تو محیطهای عملیاتی حیاتی است. PM2 تمام عملیاتهای خودش رو در حافظه (in memory) انجام میده و وابستگی به پایگاهداده یا فایل خاصی نداره. این یعنی با ریاستارت شدن OS، تمام اطلاعات PM2 پاک میشه (غیر از فایلهای log) و با خاموش شدنش دیگه لیستی از برنامهها رو نداره. برای اینکه بتونیم لیست و وضعیت برنامهها رو مجدد در اختیار داشته باشیم باید از دستور pm2 save
جهت ذخیره برنامههای فعلی و pm2 resurrect
جهت بازگردانی لیست ذخیره شده استفاده کنیم. دستور ذخیره الزامی هستش اما عملیات بازگردانی و لود مجدد لیست رو میشه تحت عنوان سرویس در سیستم عامل تعریف کرد تا به طور خودکار با روشن شدن OS برنامههای ما هم توسط PM2 اجرا بشن.
برای تعریف و راهاندازی سرویس کافیه دستور pm2 startup
رو اجرا کنید و اگر با خطایی مواجه نشدید سرویس PM2 با موفقیت راهاندازی شده و فقط کافیه که لیست مورد نظرتون رو ذخیره کرده باشید. توجه کنید که سیستم عاملهای تحت پوشش این دستور محدوده:
- systemd: Ubuntu >= 16, CentOS >= 7, Arch, Debian >= 7
- upstart: Ubuntu <= 14
- launchd: Darwin, MacOSx
- openrc: Gentoo Linux, Arch Linux
- rcd: FreeBSD
- systemv: Centos 6, Amazon Linux
اگر سیستم عامل مورد نظر ویندوز باشه باید به صورت دستی سرویس تعریف بشه. برای راحتی کار میتونید از نرمافزار nssm استفاده کنید و یک فایل batch script که شامل دستور pm2 resurrect
باشه رو به عنوان سرویس اجرا کنید. برای مثال:
فایل pm2_resurrect.bat
:
pm2 resurrect
دستور ایجاد سرویس با استفاده از nssm: nssm.exe install NSSM_Pm2Resurrect "I:\path\pm2_resurrect.bat"
قسمت قرمز رنگ عنوان سرویس و قسمت نارنجی آدرس فایل batch رو نشون میده.