الإجابة
لأ، مش منفصلة. الـ service دي مجرد مفتاح تشغيل لنفس الـ PM2 اللي ماسك الـ apps بتاعتك.
الترتيب
systemd └─ pm2-ubuntu.service ← بتقوم مع الـ boot └─ PM2 daemon ← نفس الـ PM2 اللي بتكلمه بـ pm2 list ├─ LMS::backend worker 1 ├─ LMS::backend worker 2 └─ ...- systemd: وظيفته بس إنه يشغّل الـ PM2 daemon لما السيرفر يقوم.
- الـ PM2 daemon: هو اللي بيدير الـ apps. بيشغّلها، ويرجّع اللي يقع منها، ويوزّع الـ requests في الـ cluster.
- أوامر
pm2في الـ terminal: بتكلم نفس الـ daemon ده عن طريق socket في~/.pm2، مش نسخة تانية.
الـ service بتعمل إيه جواها؟
لو فتحت الملف بالأمر ده:
terminal
systemctl cat pm2-ubuntuهتلاقي حاجة شبه كده:
/etc/systemd/system/pm2-ubuntu.service
[Service]Type=forkingUser=ubuntuEnvironment=PATH=/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbinEnvironment=PM2_HOME=/home/ubuntu/.pm2PIDFile=/home/ubuntu/.pm2/pm2.pidRestart=on-failureExecStart=/usr/bin/pm2 resurrectExecReload=/usr/bin/pm2 reload allExecStop=/usr/bin/pm2 kill- عند الـ boot: بتنفذ
pm2 resurrect، فيقوم الـ daemon ويقرأdump.pm2ويرجّع الـ apps. - عند الإيقاف: بتنفذ
pm2 kill. يعني لو عملتsystemctl stop pm2-ubuntuهتقفل الـ apps كلها، لأنه نفس الـ daemon. systemctl reload pm2-ubuntu: بينفذpm2 reload all.Environment=PATH: هنا بالظبط مسار الـ node اللي اتحفظ وقت الـ startup. ولو Node متسطب بـ nvm، هتلاقي أول المسار حاجة زي/home/ubuntu/.nvm/versions/node/v22.11.0/bin، وكمان الـpm2فيExecStartهيبقى من نفس الفولدر. وده سبب إنك تعيد الـ startup بعد تغيير Node.UserوPM2_HOME: دول اللي بيحددوا أنهي daemon وأنهيdump.pm2هيتقري.
حاجتين ممكن يلخبطوك
pm2وsudo pm2اتنين daemons مختلفين. كل يوزر ليه PM2 خاص بيه في الـ home بتاعه، فـ root عنده/root/.pm2. لو شغلت الـ apps بـsudo pm2وعملت startup ليوزر عادي، بعد الـ reboot مش هتلاقيهم. خليك على يوزر واحد في كل حاجة.- أول مرة بعد
pm2 startup، ممكنsystemctl statusيقولك إن الـ service مش شغالة (inactive)، رغم إن الـ apps شغالة. ده لأن الـ daemon الحالي إنت اللي شغلته بإيدك، مش systemd، وpm2 startupبيعملenableبس مشstart. ودي مش مشكلة، فبعد أول reboot systemd هيبقى هو اللي مشغّله.
terminal
pm2 list # الـ apps بتاعة اليوزر الحاليsudo pm2 list # الـ apps بتاعة root، غالبًا فاضية، ولو مش فاضية ده سبب اللخبطة🧪 Lab: جرّب الـ reboot بجد
متعتبرش الإعداد ناجح عشان systemctl status أخضر. جرّب في وقت هادي:
terminal
whoami # لازم يكون يوزر الـ apppm2 list && pm2 savesystemctl is-enabled pm2-$(whoami) # enabledsudo rebootبعد ما يقوم:
terminal
systemctl status pm2-$(whoami) # المرة دي active (running)pm2 list # نفس الأسماء ونفس العددcurl -k https://localhost:4000 # الـ app بيرد فعلًالو الـ apps مرجعتش
اسأل بالترتيب ده:
- هل الـ service enabled؟
systemctl is-enabled pm2-ubuntu. - هل هي لنفس اليوزر؟ قارن سطر
User=فيsystemctl catبـwhoami. - هل
dump.pm2موجود وحديث؟ls -l ~/.pm2/dump.pm2، وقارن الوقت بآخر تغيير عملته. - هل مسار الـ node لسه موجود؟ قارن سطر
Environment=PATHبـwhich node. - إيه اللي اتكتب وقت الـ boot؟
journalctl -u pm2-ubuntu -b. - الـ app قام ووقع؟
pm2 logs --err --lines 50، وغالبًا السبب env ناقصة أوcwdغلط.
بديل: cron لو مفيش systemd
ده حل احتياطي، مش أحسن من الـ service. في crontab لنفس اليوزر:
terminal
which pm2 # خد المسار الكاملcrontab -ecrontab
@reboot /home/pmstest/.npm-global/bin/pm2 resurrectلازم تكتب المسار الكامل، لأن cron بيشتغل بـ PATH صغير جدًا ومش هيلاقي pm2 بالاسم بس. ولو pm2 بيتشغّل بـ node من nvm، cron مش هيلاقي node برضه، فاكتب في السطر قبله PATH= بمسار فولدر الـ node.
خلّصت الفصل لما
🧠 اختبر نفسك
١) عملت sudo systemctl stop pm2-ubuntu. الـ apps هتفضل شغالة؟
لأ. ExecStop هو pm2 kill، فالـ daemon والـ apps كلهم بيقفلوا.
٢) الـ apps شغالة بـ sudo pm2، والـ startup ليوزر ubuntu. بعد الـ reboot؟
pm2 list هتبقى فاضية، لأن الـ service بتقرا /home/ubuntu/.pm2 والـ apps محفوظة في /root/.pm2.
٣) لسه عامل pm2 startup والـ status بيقول inactive والـ apps شغالة. فيه مشكلة؟
لأ. الـ daemon الحالي إنت اللي شغلته، وstartup بيعمل enable بس. بعد أول reboot هتبقى active.