تخطَّ إلى المحتوى
ToolMug

مولّد ملف خدمة systemd

أبقِ برنامج Node.js أو Python أو Go يعمل على خادم Linux، وشغّله عند الإقلاع وأعد تشغيله إذا تعطل، دون حفظ كل خيارات systemd. اكتب الأمر والمستخدم، واختر سياسة إعادة التشغيل ومتغيرات البيئة، ثم انسخ ملف .service مع أوامر تثبيته وتشغيله. فعّل «التشغيل وفق جدول» للحصول على .timer كبديل حديث لـ cron.

يعمل في متصفحك — لا يُرفع أي شيء تُدخله

يصبح اسم الملف، مثل myapp ← myapp.service

استخدم المسار الكامل للبرنامج، مثل /usr/bin/python3 app.py

يستمر الأمر في العمل في المقدمة (معظم تطبيقات الويب والسكربتات).

متغير واحد بصيغة KEY=value في كل سطر، وتوضع القيم التي تحتوي على مسافات بين علامات اقتباس تلقائيًا.

القيمة 0 تُبقي الإعداد الافتراضي للنظام.

myapp.service

التثبيت والتشغيل

الصق الأوامر على الخادم بحساب root. بعد تعديل ملف الوحدة، شغّل systemctl daemon-reload مرة أخرى. السجلات: journalctl -u <name>.

طريقة الاستخدام

  1. أدخل اسم الخدمة والأمر بمساره الكامل ومجلد العمل.
  2. حدّد المستخدم وسياسة إعادة التشغيل وأي متغيرات بيئة.
  3. أضف اختياريًا تحصينًا أساسيًا أو جدولًا (OnCalendar) لإنشاء مؤقّت.
  4. انسخ الملفات الناتجة، أو الصق أوامر التثبيت في طرفية root على الخادم.

شرح الخيارات

Type
يناسب simple البرامج التي تبقى في المقدمة، ويناسب oneshot السكربتات التي تعمل مرة واحدة مثل المهام المجدولة.
Restart
«عند الفشل» يعيد تشغيل الخدمة عند انتهائها بخطأ أو تعطلها، و«دائمًا» يعيد تشغيلها أيضًا بعد الانتهاء الطبيعي.
OnCalendar
وقت إطلاق المؤقّت، مثل daily أو *-*-* 03:00:00 للثالثة فجرًا كل يوم. اختبر العبارات بالأمر systemd-analyze calendar.

مثال: مهمة ليلية على هيئة مؤقّت

لتشغيل سكربت كل ليلة في الساعة 3 فجرًا، اضبط «الأمر (ExecStart)» على /usr/local/bin/backup.sh، واسم الخدمة على backup، وType على oneshot وRestart على «أبدًا»، ثم فعّل «التشغيل وفق جدول (إنشاء .timer)» و«تحصين أساسي». ومع المستخدم ومجلد العمل الافتراضيين، ينتج المولّد ملفين. الملف backup.service:

[Unit]
Description=Nightly backup

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/srv/myapp
ExecStart=/usr/local/bin/backup.sh
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=read-only

والملف backup.timer:

[Unit]
Description=Run backup on a schedule

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
Unit=backup.service

[Install]
WantedBy=timers.target

يتغير أمران عند تفعيل المؤقّت. يفقد ملف الخدمة قسم [Install]، لأن المؤقّت هو الذي يشغّله، وتفعّل أوامر التثبيت المؤقّت بدلًا من الخدمة:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
journalctl -u backup.service -f

لا يتغير Type تلقائيًا عند تفعيل خيار المؤقّت، فاختر oneshot بنفسك للمهام التي تنتهي. وخدمة oneshot مع Restart بقيمة Always غير صالحة، لذا يترك المولّد Restart خارج الملف ويعرض تحذيرًا.

الأسئلة الشائعة

أين أضع الملف؟

في /etc/systemd/system/. ثم شغّل systemctl daemon-reload وsystemctl enable --now <name>.service، وتنفّذ الأوامر الناتجة ذلك كله.

لماذا تفشل خدمتي بالرسالة «Executable path is not absolute»؟

تتطلب إصدارات systemd الأقدم المسار الكامل للبرنامج في ExecStart. اعثر عليه بالأمر which، مثل which node.

المؤقّت أم cron؟

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

الخصوصية

تعمل هذه الأداة بالكامل داخل متصفحك. تُعالَج ملفاتك ونصوصك على جهازك ولا تُرفع أبدًا إلى خوادمنا.

أدوات ذات صلة